gpt4 book ai didi

go - 解码一个字符串化的 json

转载 作者:IT王子 更新时间:2023-10-29 01:57:04 24 4
gpt4 key购买 nike

我正在尝试使用嵌套的 json 解码 json。

我正在使用这个结构

type atomRequest struct {
Stream string `json:"stream"`
Data map[string]interface{} `json:"data"`
}

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

如果我正在编码的字节数组带有非转义“数据”“数据” map 正在正确填充。

如果嵌套的 json 被字符串化,我得到一个空的数据映射。

我正在寻找一种解码嵌套数据的解决方案,无论其是否被字符串化。

示例:此输入有效:

{"stream":"foobar","data":{"errorID":112,"timestamp":1524737466}}

此输入无效:

{
"stream": "foo",
"data": "{\"cd3\":\"514\",\"cd8\":\"none\"}"
}

你能帮忙吗?

谢谢

最佳答案

使用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

关于go - 解码一个字符串化的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50086711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com