Golang json.RawMessage: 解析不确定的 JSON 数据
json.RawMessage 是一个字节切片类型,用于存储未解析的 JSON 数据。当我们不确定 JSON 数据的结构时,可以使用 json.RawMessage 来存储,然后再根据具体情况进行解析。
以下是一个示例,展示如何使用 json.RawMessage 来解析不确定的 JSON 数据:
package main
import (
"encoding/json"
"fmt"
)
type Data struct {
Name string
Value json.RawMessage
}
func main() {
jsonData := `[{"Name": "A", "Value": {"A1": 1, "A2": "a"}},{"Name": "B", "Value": {"B1": true, "B2": ["b", "c"]}},{"Name": "C", "Value": {"C1": {"C11": "x"}, "C2": "y"}}]`
var data []Data
err := json.Unmarshal([]byte(jsonData), &data)
if err != nil {
fmt.Println("Error:", err)
return
}
for _, d := range data {
fmt.Println(d.Name)
var value map[string]interface{}
err := json.Unmarshal(d.Value, &value)
if err != nil {
fmt.Println("Error:", err)
continue
}
for k, v := range value {
fmt.Printf("%s: %v\n", k, v)
}
}
}
在上面的示例中,我们定义了一个 Data 类型,包含一个 Name 字符串字段和一个 Value json.RawMessage 字段。然后,我们定义了一个 JSON 字符串 jsonData,其中包含了不同结构的 JSON 数据。接着,我们使用 json.Unmarshal 函数将 jsonData 解析到一个 data 变量中。
在循环中,我们先输出每个数据的 Name 字段,然后再将 Value 字段解析到一个 map[string]interface{} 变量中。由于我们不知道 Value 字段的具体结构,因此使用 interface{} 类型来存储。最后,我们遍历该 map,输出每个键值对。如果解析出错,我们将继续循环处理下一个数据。
原文地址: https://www.cveoy.top/t/topic/lAxm 著作权归作者所有。请勿转载和采集!