为什么JSON解析失败并且传递给Decode()的类型完全不同?

时间:2018-06-03 19:51:56

标签: json go jsonparser

我有以下数据结构,我想从API解析:

type OrderBook struct {
    Pair       string           `json:"pair"`
    UpdateTime int64            `json:"update_time"`
}

type depthResponse struct {
    Result OrderBook `json:"result"`
    // doesn't matter here
    //Cmd    string              `json:"-"`
}

当我解析以下内容时:

data := `{"error":{"code":"3016","msg":"交易对错误"},"cmd":"depth"}`

它不会失败。为什么呢?

完整源代码(playground

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "strings"
)

type OrderBook struct {
    Pair       string           `json:"pair"`
    UpdateTime int64            `json:"update_time"`
}

type depthResponse struct {
    Result OrderBook `json:"result"`
}

func main() {
    data := `{"error":{"code":"3016","msg":"交易对错误"},"cmd":"depth"}`
    r := strings.NewReader(data)

    var resp depthResponse
    if err := json.NewDecoder(r).Decode(&resp); err != nil {
        log.Fatalf("We should end up here: %v", err)
    }

    fmt.Printf("%+v\n", resp)
}

1 个答案:

答案 0 :(得分:4)

Decode的预期行为(如Unmarshal函数中所述):

https://golang.org/pkg/encoding/json/#Unmarshal

  

默认情况下,忽略没有相应结构字段的对象键。

但是,如果输入JSON的目标结构中没有包含字段,则可以使用DisallowUnknownFields()函数(如文档中所述)使其失败。

dec := json.NewDecoder(r)
dec.DisallowUnknownFields()

在这种情况下,您会收到预期的错误。

此处修改了游乐场:https://play.golang.org/p/A0f6dxTXV34