解组一个字符串化的json

时间:2018-04-29 12:45:28

标签: go

我正在尝试用嵌套的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\"}"
}
你可以帮忙吗?

感谢

1 个答案:

答案 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
}

playground example