golang 如何将不固定层级的被jsonencode的字符串加载到结构体
在Go中,可以使用json.Unmarshal()函数将JSON字符串加载到结构体中。但是,由于JSON字符串中的层级是不固定的,我们无法提前定义一个对应的结构体。
为了解决这个问题,我们可以使用map[string]interface{}类型来解析不固定层级的JSON字符串。这样可以将JSON字符串解析为一个嵌套的map,其中的每个键都是字符串,每个值可以是任意类型。
以下是一个示例代码,展示了如何将不固定层级的JSON字符串加载到结构体中:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
Address string
}
func main() {
jsonStr := `{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York",
"state": "NY"
}
}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println("Error:", err)
return
}
person := Person{
Name: data["name"].(string),
Age: int(data["age"].(float64)),
Address: data["address"].(map[string]interface{})["street"].(string),
}
fmt.Println(person)
}
在上面的代码中,我们首先定义了一个Person结构体,它有三个字段:Name、Age和Address。然后,我们定义了一个JSON字符串jsonStr,其中包含了一个嵌套的address属性。
我们使用json.Unmarshal()函数将JSON字符串解析为一个map[string]interface{}类型的变量data。然后,我们可以使用data的键值对来构建Person结构体。
需要注意的是,由于json.Unmarshal()函数将所有数字解析为float64类型,我们需要使用类型断言将其转换为相应的类型。同时,如果JSON字符串中的键不存在或类型不匹配,会导致程序运行时错误,因此需要进行错误检查。
最后,我们打印输出person结构体的值,可以看到JSON字符串已成功加载到结构体中
原文地址: https://www.cveoy.top/t/topic/imTQ 著作权归作者所有。请勿转载和采集!