使用struct进行JSON解析

时间:2019-04-26 05:49:56

标签: go

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

2 个答案:

答案 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"`
}

sites (auto generate convert json to struct)可能对您有帮助

答案 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)

        }

    }

}