json - 在 Go 中聚合 JSON 对象

标签 json go marshalling

我正在制作一个 Go 服务,该服务从不同来源收集 JSON 对象并将它们聚合到一个 JSON 对象中。

我想知道是否有任何方法可以聚合子对象而无需再次解码和重新编码它们或手动构建 JSON 字符串。

我正在考虑使用包含已经编码的部分的 struct,例如:

type Event struct {
    Place     string `json:"place"`
    Attendees string `json:"attendees"`
}

其中 PlaceAttendees 本身是 JSON 字符串。我想以某种方式将它们标记为“已编码”,这样它们就不会以转义的 JSON 字符串结束,而是按原样使用。

有什么办法可以实现吗?

最佳答案

您可以使用 json.RawMessage

RawMessage is a raw encoded JSON object. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding.

此外,json.RawMessage[]byte 的别名,因此您可以通过这种方式为其赋值:

v := json.RawMessage(`{"foo":"bar"}`)

例子:

package main

import (
    "encoding/json"
    "fmt"
)

type Event struct {
    Place     json.RawMessage `json:"place"`
    Attendees json.RawMessage `json:"attendees"`
}

func main() {
    e := Event{
         Place: json.RawMessage(`{"address":"somewhere"}`),
         Attendees: json.RawMessage(`{"key":"value"}`),
    }
    c, err := json.Marshal(&e)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(c))
    // {"place":{"address":"somewhere"},"attendees":{"key":"value"}}
}

关于json - 在 Go 中聚合 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37573395/

相关文章:

c# - 签名不兼容互操作 - 从 c# 调用 c 方法

c# - 如何在托管代码中正确翻译 WH_MOUSE lparam

java - 使用 JSON 文件解析信息中的 url 来显示 URL 中的图像

java - 使用 MOXy 将 JsonObject 属性映射到 XML

ios - 将 JSON 字符串解析为 NSDictionary 成对象数组 Objective C

go - int 前的插入符号是什么意思?

json - 向 Golang API 发送请求以发送 JSON 和字符串化 JSON

go - 使用 gonum 进行无放回加权采样

json - 使用 sqlite3、nodejs 从数据库存储、检索、解析 JSON 对象的正确方法

java - 防止请求在 JSON 文件更新时从 json 文件中获取数据