如何解析以下两个JSON并打印“ c”值
1)
{
"a": {
"b": {
"c": 123
},
"b": {
"c": 456
}
}
}
2)
{
"a": {
"b": {
"c": 444
}
}
}
下面的结构帮助解析,但然后如何遍历b,它不是数组? 请帮忙。
type Data struct {
A struct {
B struct {
C int `json:"c"`
} `json:"b"`
} `json:"a"`
}
答案 0 :(得分:1)
第一个是无效的json。 如果要遍历“ b”,应该像这样
{
"a": {
"b": [
{"c":123},
{"c":456}
]}
}
然后是结构
type Data struct {
A struct {
B []struct {
C int `json:"c"`
} `json:"b"`
} `json:"a"`
}
答案 1 :(得分:1)
感谢CeriseLimón和Minji
有JSON.RawMessage类型可以解决此问题 从第三方API接收到无效的JSON格式,因此无法更改。
package main
import (
"encoding/json"
"fmt"
"log"
"strings"
)
type DatainC struct {
C int `json:"c"`
}
type Data struct {
A json.RawMessage `json:"a"`
}
func main() {
blob := `{
"a": {
"b": {
"c": 123
},
"b": {
"c": 456
}
}
}`
var abc Data
if err := json.Unmarshal([]byte(blob), &abc); err != nil {
log.Fatal(err)
}
data, _ := abc.A.MarshalJSON()
//log.Println("JSON Data", string(data))
dec := json.NewDecoder(strings.NewReader(string(data)))
// read open bracket
t, err := dec.Token()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%T: %v\n", t, t)
for dec.More() {
t1, err1 := dec.Token()
if err1 != nil {
log.Fatal(err1)
}
if t1 == "b" {
var c DatainC
err2 := dec.Decode(&c)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("Value of C - ", c.C)
}
}
}