为什么我无法使用Unmarshal解析具有嵌套数组的json

时间:2019-12-08 16:42:24

标签: json go unmarshalling

我想在Go中使用json.Unmarshal解析此json。

{
    "quotes": [
        {
            "high": "1.9981",
            "open": "1.9981",
            "bid": "1.9981",
            "currencyPairCode": "GBPNZD",
            "ask": "2.0043",
            "low": "1.9981"
        },
        {
            "high": "81.79",
            "open": "81.79",
            "bid": "81.79",
            "currencyPairCode": "CADJPY",
            "ask": "82.03",
            "low": "81.79"
        }
    ]
}

source返回有关解析结果的{[]}


type GaitameOnlineResponse struct {
    quotes []Quote
}

type Quote struct {
    high             string
    open             string
    bid              string
    currencyPairCode string
    ask              string
    low              string
}

func sampleParse() {
    path := os.Getenv("PWD")
    bytes, err := ioutil.ReadFile(path + "/rate.json")
    if err != nil {
        log.Fatal(err)
    }
    var r GaitameOnlineResponse
    if err := json.Unmarshal(bytes, &r); err != nil {
        log.Fatal(err)
    }
    fmt.Println(r)
    // {[]} 
}

我不知道结果的原因。

2 个答案:

答案 0 :(得分:1)

编辑:正如@mkopriva指出,例如,如果未导出字段(例如,以大写字母开头),JSON将不会解组到该结构中。

type GaitameOnlineResponse struct {
    Quotes []Quote `json:"quotes"`
}

type Quote struct {
    High             string `json:"high"`
    Open             string `json:"open"`
    Bid              string `json:"bid"`
    CurrencyPairCode string `json:"currencyPairCode"` // add tags to match the exact JSON field names
    Ask              string `json:"ask"`
    Low              string `json:"low"`
}

有很多在线JSON验证器,例如https://jsonlint.com/

将JSON粘贴会显示错误:

Error: Parse error on line 17:
..."low": "81.79"

在第18行添加]以完成数组将修复您的JSON,例如

            "low": "81.79"
        }
    ]
}

答案 1 :(得分:1)

我必须出口。

type GaitameOnlineResponse struct {
    Quotes []Quote
}

type Quote struct {
    High             string
    Open             string
    Bid              string
    CurrencyPairCode string
    Ask              string
    Low              string
}

我解决了。