1 回答

TA贡献2080条经验 获得超4个赞
如果使用json.RawMessage
,JSON 源文本将不会被解析,而是按原样存储在其中(它是 a []byte
)。
因此,如果您想分发相同的 JSON 数组元素,则无需对其进行任何操作,您可以按原样“移交”它。您不必将其传递给json.Marshal()
,它已经是 JSON 编组文本。
所以只需这样做:
for _, input := range inputs.Foo { // input is of type json.RawMessage, and it's already JSON text }
如果您将 a 传递json.RawMessage
给json.Marshal()
,它可能会被重新编码,例如压缩(这可能会导致不同的字节序列,但它会保存与 JSON 相同的数据)。
压缩甚至可能是一个好主意,因为从原始上下文(对象和数组)中取出原始缩进可能看起来很奇怪,而且它会更短。要简单地压缩 JSON 文本,您可以json.Compact()
这样使用:
for _, input := range inputs.Foo {
buf := &bytes.Buffer{}
if err := json.Compact(buf, input); err != nil {
panic(err)
}
fmt.Println(buf) // The compacted array element value
}
如果您不想压缩它,而是自己缩进数组元素,请json.Indent()像这样使用:
for _, input := range inputs.Foo {
buf := &bytes.Buffer{}
if err := json.Indent(buf, input, "", " "); err != nil {
panic(err)
}
fmt.Println(buf)
}
使用您的示例输入,这是第一个数组元素的样子(原始、压缩和缩进):
Orignal:
{
"id": "1234",
"someNestedObject": {
"someBool": true,
"randomNumber": 488
},
"timestamp": "2021-12-13T02:43:44.155Z"
}
Compacted:
{"id":"1234","someNestedObject":{"someBool":true,"randomNumber":488},"timestamp":"2021-12-13T02:43:44.155Z"}
Indented:
{
"id": "1234",
"someNestedObject": {
"someBool": true,
"randomNumber": 488
},
"timestamp": "2021-12-13T02:43:44.155Z"
}
试试Go Playground上的示例。
另请注意,如果您决定压缩或缩进循环中的单个数组元素,您可以bytes.Buffer
在循环之前创建一个简单的,并在每次迭代中重用它,调用它的Buffer.Reset()
方法来清除前一个数组的数据。
它可能看起来像这样:
buf := &bytes.Buffer{}
for _, input := range inputs.Foo {
buf.Reset()
if err := json.Compact(buf, input); err != nil {
panic(err)
}
fmt.Println("Compacted:\n", buf)
}
- 1 回答
- 0 关注
- 148 浏览
添加回答
举报