golang 多层不确定的json 如何用json.RawMessage 获取里面的数据
可以使用 json.RawMessage 和递归函数来处理多层不确定的 JSON 数据。
假设我们有以下 JSON 数据:
{
"name": "John Smith",
"age": 35,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phoneNumbers": [
{
"type": "home",
"number": "555-555-1234"
},
{
"type": "work",
"number": "555-555-5678"
}
]
}
我们可以使用以下代码来获取其中的数据:
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := []byte(`
{
"name": "John Smith",
"age": 35,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phoneNumbers": [
{
"type": "home",
"number": "555-555-1234"
},
{
"type": "work",
"number": "555-555-5678"
}
]
}
`)
var m map[string]json.RawMessage
err := json.Unmarshal(data, &m)
if err != nil {
fmt.Println("Error:", err)
return
}
// Get name
var name string
err = json.Unmarshal(m["name"], &name)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Name:", name)
// Get age
var age int
err = json.Unmarshal(m["age"], &age)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Age:", age)
// Get address
var address map[string]json.RawMessage
err = json.Unmarshal(m["address"], &address)
if err != nil {
fmt.Println("Error:", err)
return
}
var street string
err = json.Unmarshal(address["street"], &street)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Street:", street)
// Get city
var city string
err = json.Unmarshal(address["city"], &city)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("City:", city)
// Get state
var state string
err = json.Unmarshal(address["state"], &state)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("State:", state)
// Get zip
var zip string
err = json.Unmarshal(address["zip"], &zip)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Zip:", zip)
// Get phone numbers
var phoneNumbers []map[string]json.RawMessage
err = json.Unmarshal(m["phoneNumbers"], &phoneNumbers)
if err != nil {
fmt.Println("Error:", err)
return
}
for i, phoneNumber := range phoneNumbers {
fmt.Printf("Phone number %d:\n", i+1)
var number string
err = json.Unmarshal(phoneNumber["number"], &number)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Number:", number)
var phoneType string
err = json.Unmarshal(phoneNumber["type"], &phoneType)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Type:", phoneType)
}
}
输出:
Name: John Smith
Age: 35
Street: 123 Main St
City: Anytown
State: CA
Zip: 12345
Phone number 1:
Number: 555-555-1234
Type: home
Phone number 2:
Number: 555-555-5678
Type: work
原文地址: https://www.cveoy.top/t/topic/uLI 著作权归作者所有。请勿转载和采集!