golang 多层不确定的json 如何获取里面的数据
在Go语言中,可以使用标准库中的encoding/json包来解析JSON数据。对于多层不确定的JSON数据,可以使用map[string]interface{}类型来表示。该类型表示了一个键值对的集合,其中键是字符串类型,值可以是任意类型,包括string、int、float、bool、[]interface{}和map[string]interface{}等。
以下是一个示例JSON数据:
{
"name": "Alice",
"age": 30,
"address": {
"city": "New York",
"state": "NY",
"zipcode": "10001"
},
"phone_numbers": [
{
"type": "home",
"number": "123-456-7890"
},
{
"type": "work",
"number": "987-654-3210"
}
]
}
要获取其中的数据,可以使用以下代码:
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"name":"Alice","age":30,"address":{"city":"New York","state":"NY","zipcode":"10001"},"phone_numbers":[{"type":"home","number":"123-456-7890"},{"type":"work","number":"987-654-3210"}]}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println("Error:", err)
return
}
name := data["name"].(string)
age := int(data["age"].(float64))
address := data["address"].(map[string]interface{})
city := address["city"].(string)
state := address["state"].(string)
zipcode := address["zipcode"].(string)
phoneNumbers := data["phone_numbers"].([]interface{})
for i, phoneNumber := range phoneNumbers {
phoneNumberMap := phoneNumber.(map[string]interface{})
phoneType := phoneNumberMap["type"].(string)
number := phoneNumberMap["number"].(string)
fmt.Printf("Phone %d: %s - %s\n", i+1, phoneType, number)
}
}
输出结果:
Phone 1: home - 123-456-7890
Phone 2: work - 987-654-3210
在上面的示例中,我们首先使用json.Unmarshal函数将JSON字符串解析成一个map[string]interface{}类型的变量data。然后,我们可以使用data变量中的键来获取对应的值。例如,data["name"]获取到的是一个interface{}类型的值,我们需要使用类型断言将其转换成string类型,即data["name"].(string)。
对于嵌套的JSON数据,我们可以使用类型断言将其转换成map[string]interface{}类型,例如data["address"].(map[string]interface{})。对于phone_numbers键对应的值,它是一个[]interface{}类型的切片,我们可以使用类型断言将其转换成切片类型,并遍历其中的每个元素。对于每个元素,它是一个map[string]interface{}类型,我们可以使用类型断言将其转换成该类型,并获取其中的type和number键对应的值。
需要注意的是,在使用类型断言时,如果类型不匹配,会导致运行时错误。因此,在实际使用中,需要根据实际情况进行类型检查和错误处理。
原文地址: https://www.cveoy.top/t/topic/uLo 著作权归作者所有。请勿转载和采集!