首页 > 文章列表 > golang如何解析/反序列化动态 JSON

golang如何解析/反序列化动态 JSON

golang
321 2023-05-03

问题内容

golang如何解析/反序列化动态 JSON

正确答案

在 Golang 中,可以使用 json.Unmarshal() 函数将 JSON 字符串反序列化为动态的 map[string]interface{}[]interface{}。这个函数需要两个参数,第一个是要反序列化的 JSON 字符串,第二个是反序列化后的数据结构指针。例如:

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonString := `{"name": "Alice", "age": 30}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonString), &data)
    if err != nil {
        panic(err)
    }
    fmt.Println(data["name"]) // Output: Alice
    fmt.Println(data["age"]) // Output: 30
}

在这个例子中,我们使用 json.Unmarshal() 将 JSON 字符串反序列化为 map[string]interface{} 类型的 data 变量。由于 JSON 中的键值对是动态的,因此我们使用 map[string]interface{} 类型来存储这些数据。反序列化后,我们可以像访问普通的 map 一样访问其中的数据。

如果 JSON 中包含了数组,我们可以将其反序列化为 []interface{} 类型的变量。例如:

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonString := `[1, "two", {"three": 3}]`
    var data []interface{}
    err := json.Unmarshal([]byte(jsonString), &data)
    if err != nil {
        panic(err)
    }
    fmt.Println(data[0]) // Output: 1
    fmt.Println(data[1]) // Output: two
    fmt.Println(data[2].(map[string]interface{})["three"]) // Output: 3
}

在这个例子中,我们使用 json.Unmarshal() 将 JSON 字符串反序列化为 []interface{} 类型的 data 变量。由于 JSON 中的数组是动态的,因此我们使用 []interface{} 类型来存储这些数据。反序列化后,我们可以像访问普通的数组一样访问其中的数据。注意,这里我们使用了类型断言来将 data[2] 转换为 map[string]interface{} 类型,以便访问其中的键值对。