我有以下数据结构,我想从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)
}
答案 0 :(得分:4)
Decode
的预期行为(如Unmarshal
函数中所述):
https://golang.org/pkg/encoding/json/#Unmarshal
默认情况下,忽略没有相应结构字段的对象键。
但是,如果输入JSON的目标结构中没有包含字段,则可以使用DisallowUnknownFields()
函数(如文档中所述)使其失败。
dec := json.NewDecoder(r)
dec.DisallowUnknownFields()
在这种情况下,您会收到预期的错误。