首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解编成字符串的json

解编成字符串的json
EN

Stack Overflow用户
提问于 2018-04-29 12:45:27
回答 1查看 727关注 0票数 2

我正试图用嵌套的json解压缩一个json。

我正在使用这个结构

代码语言:javascript
复制
type atomRequest struct {
    Stream string                 `json:"stream"`
    Data   map[string]interface{} `json:"data"`
}

如果嵌套的json是字符串化的,则Unmasrhaling失败,值为零。

如果我正在编组的字节数组具有非转义“数据”,则正确地填充“数据”映射。

如果嵌套的json被压缩,我将得到一个空的数据映射。

我正在寻找一个解组嵌套数据的解决方案,不管它是否是字符串化的。

示例:此输入工作:

代码语言:javascript
复制
{"stream":"foobar","data":{"errorID":112,"timestamp":1524737466}}

此输入不起作用:

代码语言:javascript
复制
{
    "stream": "foo",
    "data": "{\"cd3\":\"514\",\"cd8\":\"none\"}"
}

你能帮忙吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-29 13:05:46

使用json.RawMessage捕获可变字段:

代码语言:javascript
复制
type atomRequest struct {
    Stream  string                 `json:"stream"`
    RawData json.RawMessage        `json:"data"`
    Data    map[string]interface{} `json:"-"`
}

解封顶级JSON:

代码语言:javascript
复制
var req atomRequest
if err := json.Unmarshal(data, &req); err != nil {
    // handle error
}

如果data是字符串,则反封送处理以删除额外级别的编码:

代码语言:javascript
复制
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{}进行封送

代码语言:javascript
复制
if err := json.Unmarshal(req.RawData, &req.Data); err != nil {
    // handle error
}

操场实例

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50086711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档