gpt4 book ai didi

json - 我可以修改 json.RawMessage 吗?

转载 作者:IT王子 更新时间:2023-10-29 01:55:13 28 4
gpt4 key购买 nike

这是对 JSON sometimes array sometimes object 的跟进

在最初的问题中,我询问了如何处理:“我正在使用一个可能为变量返回字符串或可能为变量返回数组的 json API”

我有一个解决方案,但我想知道,有没有办法修改 json.RawMessage?

如果/然后查看 RawMessage 中的 [ 或 { 字符以确定对象是数组还是字符串,如果我总是采用 RawMessage 变量字符串并将其转换为数组会怎样?

这样,我就不必为字符串和数组编写所有访问器的代码。我可以简单地处理数组。

所以我的问题是:有没有办法修改 json.RawMessage?

例如:

打开这个:

{ 
"net": {
"comment": {
"line":
{
"$": "All abuse issues will only be responded to by the Abuse",
"@number": "0"
}
}
}

进入这个:

{ 
"net": {
"comment": {
"line": [
{
"$": "All abuse issues will only be responded to by the Abuse",
"@number": "0"
}
]
}
}

这样一来,当我解码到我的结构中时,只有一种类型的 comment.line,即 line[] 与 line[] AND line。

提前致谢。

我是一个 golang 新手,我刚刚开始思考解码为强类型语言的困难。

最佳答案

是的,您可以编辑 json.RawMessage 类型,因为它只是 []byte 的别名。

也就是说,您不需要保留原始类型,只需创建您自己的数组类型实现,并在您的自定义 Unmarshal 函数中,将标量设为数组。

这是一个例子(在 Play 上)。

我们在这里所做的就是查看 MagicArray 的字节是否以“[”开头,如果是,则正常解码。否则,解码并追加到 slice 。

您将必须为您想要像这样工作的每种类型实现自定义数组,但这可能仍然比尝试安全地操作 json 二进制文件以尝试将标量强制转换为数组要好。

这种方法的另一个好处是您可以使用流式 json 解码器,如 json.NewDecoder(reader).Decode(&obj)

package main

import "encoding/json"
import "log"

type MagicArray []interface{}

func (ma *MagicArray) UnmarshalJSON(b []byte) error {
if b[0] == '[' {
return json.Unmarshal(b, (*[]interface{})(ma))
} else {
var obj interface{}
if err := json.Unmarshal(b, &obj); err != nil {
return err
}
*ma = append(*ma, obj)
}
return nil
}
func main() {
myStruct := struct {
A MagicArray
B MagicArray
}{}

err := json.Unmarshal(jsonToDecode, &myStruct)
if err != nil {
log.Println("Fail:", err)
} else {
log.Println(myStruct)
}
}

var jsonToDecode = []byte(`
{
"A": "I am not an array",
"B":["I am an array"]
}
`)

关于json - 我可以修改 json.RawMessage 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663884/

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