15

在 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 的第一个版本?

4

1 回答 1

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))
}
于 2012-12-18T17:35:33.940 回答