【发布时间】:2019-07-28 11:40:16
【问题描述】:
假设我们有以下 Go 结构:
type Config struct {
Name string `json:"name,omitempty"`
Params []Param `json:"params,omitempty"`
}
type Param struct {
Name string `json:"name,omitempty"`
Value string `json:"value,omitempty"`
}
和下面的json:
{
"name": "parabolic",
"subdir": "pb",
"params": [{
"name": "input",
"value": "in.csv"
}, {
"name": "output",
"value": "out.csv",
"tune": "fine"
}]
}
然后我们进行解组:
cfg := Config{}
if err := json.Unmarshal([]byte(cfgString), &cfg); err != nil {
log.Fatalf("Error unmarshalling json: %v", err)
}
fmt.Println(cfg)
https://play.golang.org/p/HZgo0jxbQrp
输出将是 {parabolic [{input in.csv} {output out.csv}]},这是有道理的 - 未知字段被忽略。
问题:如何找出哪些字段被忽略了?
即getIgnoredFields(cfg, cfgString) 将返回 ["subdir", "params[1].tune"]
(有一个DisallowUnknownFields 选项,但它不同:此选项会导致Unmarshal 出错,而问题是如何仍然无错误地解析 json 并找出哪些字段被忽略)
【问题讨论】:
-
encoding/json不提供此功能。 -
可能还有另一种方式,如果你把结构体再编码成json,然后比较两个json,你就会发现不同。你可以使用
https://github.com/yudai/gojsondiff -
@Md.AlaminMahamud 对,我也想过这个问题,但是我们会得到像
{"one": "one", "two": "two"}这样的 json,它会被反序列化为 struct,然后返回为{"two":"two", "one": "one"}。会有差异,但没有帮助
标签: json go go-reflect