使用struct进行JSON解析

Max2019:

如何解析以下两个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"`
}
Max2019:

感谢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)

        }

    }

}



本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章