我正在尝试用嵌套的json解组json。
我正在使用这个结构
type atomRequest struct {
Stream string `json:"stream"`
Data map[string]interface{} `json:"data"`
}
如果嵌套的json被字符串化,则Unmasrhaling失败并且值为nil
如果我编组的字节数组是非转义"数据" "数据"地图正在正确填充。
如果嵌套的json被字符串化,我得到一个空数据映射。
我正在寻找解组嵌套数据的解决方案,无论是否为字符串化。
示例:此输入有效:
{"stream":"foobar","data":{"errorID":112,"timestamp":1524737466}}
此输入不起作用:
{
"stream": "foo",
"data": "{\"cd3\":\"514\",\"cd8\":\"none\"}"
}
你可以帮忙吗?
感谢
答案 0 :(得分:3)
使用json.RawMessage捕获变化字段:
type atomRequest struct {
Stream string `json:"stream"`
RawData json.RawMessage `json:"data"`
Data map[string]interface{} `json:"-"`
}
解组顶级JSON:
var req atomRequest
if err := json.Unmarshal(data, &req); err != nil {
// handle error
}
如果data
是一个字符串,请解组以删除额外的编码级别:
if len(req.RawData) > 0 && req.RawData[0] == '"' {
var s string
if err := json.Unmarshal(req.RawData, &s); err != nil {
// handle error
}
req.RawData = json.RawMessage(s)
}
最后,解散到map[string]interface{}
:
if err := json.Unmarshal(req.RawData, &req.Data); err != nil {
// handle error
}