[英]How to get values from list nested within list in JSON
我有一個 JSON 結構,例如:
{
"persons":[
{
"name":"mark",
"surname":"zuckerberg",
"data":[
{
"userid":"09210",
"username":"mark290",
"registered_date":"10-01-2017"
},
{
"userid":"092240",
"username":"mark291",
"registered_date":"11-01-2017"
}
]
},
{
"name":"bill",
"surname":"clinton",
"data":[
{
"userid":"0442340",
"username":"billy",
"registered_date":"10-01-2000"
},
{
"userid":"89472894",
"username":"billary",
"registered_date":"11-01-2015"
}
]
}
]
}
我需要為每個人獲取每個用戶名。 目前,在我完全是新手的 Go 中,我只能使用以下代碼片段獲取“數據”中的單個 JSONS:
j := []byte(data)
var f interface{}
err := json.Unmarshal(j, &f)
map := f.(map[string]interface{})
for _,item := range map["persons"].([]interface{}) {
fmt.Printf("%v", item.(map[string]interface{})["data"])
fmt.Println(err)
我很難理解如何深入到數據中的每個 JSON 結構中以獲得每個鍵值對。
您可以將JSON
字節對應的准確嵌套結構定義為Unmarshal
。
package main
import (
"encoding/json"
"fmt"
)
type Trunk struct {
Persons []Person `json:"persons"`
}
type Person struct {
Name string `json:"name"`
Surname string `json:"surname"`
Data []User `json:"data"`
}
type User struct {
Userid string `json:"userid"`
Username string `json:"username"`
Registered_date string `json:"registered_date"`
}
func main() {
rawstring := []byte(`
{
"persons":[
{
"name":"mark",
"surname":"zuckerberg",
"data":[
{
"userid":"09210",
"username":"mark290",
"registered_date":"10-01-2017"
},
{
"userid":"092240",
"username":"mark291",
"registered_date":"11-01-2017"
}
]
},
{
"name":"bill",
"surname":"clinton",
"data":[
{
"userid":"0442340",
"username":"billy",
"registered_date":"10-01-2000"
},
{
"userid":"89472894",
"username":"billary",
"registered_date":"11-01-2015"
}
]
}
]
}
`)
jsondata := Trunk{}
if err := json.Unmarshal(rawstring, &jsondata); err == nil {
fmt.Println(jsondata)
// print first username of first person
// fmt.Println(jsondata.Persons[0].Data[0].Username)
// print each username of each person
for _, person := range jsondata.Persons {
for _, d := range person.Data {
fmt.Println(d.Username)
}
}
} else {
fmt.Println("Unmarshal failed!")
}
}
或者使用更緊湊的結構定義:
type Trunk struct {
Persons []struct {
Name string `json:"name"`
Surname string `json:"surname"`
Data []struct {
Userid string `json:"userid"`
Username string `json:"username"`
Registered_date string `json:"registered_date"`
} `json:"data"`
} `json:"persons"`
}
如果你想使用流式方法,你可以嘗試解碼器找到“用戶名”令牌並獲取下一個具有“值”的令牌。
dec := json.NewDecoder(strings.NewReader(rawstring))
for {
t, err := dec.Token()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
if val, ok := t.(string); ok && val == "username" {
t, err := dec.Token()
if err == io.EOF {
break
}
fmt.Println(t)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.