golang中的严格json解析器

时间:2012-12-18 17:28:15

标签: json go

在Go中,我从第三方API获得了一些JSON,然后我试图解析它:

b := []byte(`{"age":21,"married":true}`)
var response_hash map[string]string
_ = json.Unmarshal(b, &response_hash)

但它失败了(response_hash变空)而Unmarshal只能处理带引号的JSON:

b := []byte(`{"age":"21","married":"true"}`)
var response_hash map[string]string
_ = json.Unmarshal(b, &response_hash)

有没有办法从第三方API读取第一版JSON?

1 个答案:

答案 0 :(得分:23)

Go是一种强类型语言。您需要指定JSON编码器的类型。您正在创建字符串值的映射,但您的两个json值是整数和布尔值。

这是一个带结构的工作示例。

http://play.golang.org/p/oI1JD1UUhu

package main

import (
    "fmt"
    "encoding/json"
    )

type user struct {
    Age int
    Married bool
}

func main() {
    src_json := []byte(`{"age":21,"married":true}`)
    u := user{}
    err := json.Unmarshal(src_json, &u)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Age: %d\n", u.Age)
    fmt.Printf("Married: %v\n", u.Married)
}

如果您想以更动态的方式进行操作,可以使用interface {}值的映射。您只需在使用值时键入断言。

http://play.golang.org/p/zmT3sPimZC

package main

import (
    "fmt"
    "encoding/json"
    )

func main() {
    src_json := []byte(`{"age":21,"married":true}`)
    // Map of interfaces can receive any value types
    u := map[string]interface{}{}
    err := json.Unmarshal(src_json, &u)
    if err != nil {
        panic(err)
    }
    // Type assert values
    // Unmarshal stores "age" as a float even though it's an int.
    fmt.Printf("Age: %1.0f\n", u["age"].(float64))
    fmt.Printf("Married: %v\n", u["married"].(bool))
}