Почему не выполняется синтаксический анализ JSON с совершенно другим типом, передаваемым в Decode ()? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть следующие структуры данных, которые я хотел бы проанализировать из 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"}`

Это не дает сбоя,Почему?

Полный исходный код ( детская площадка )

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 голосов
/ 03 июня 2018

Это ожидаемое поведение Decode (как описано в функции Unmarshal):

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

По умолчанию ключи объекта, которые не имеютсоответствующее поле структуры игнорируется.

Однако вы можете использовать функцию DisallowUnknownFields() (как описано в документации), чтобы она не работала, если входной JSON имеет поля, не содержащиеся в структуре назначения.

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

В этом случае вы получите сообщение об ошибке, как и ожидалось.

Модифицированная игровая площадка здесь: https://play.golang.org/p/A0f6dxTXV34

...