在 Go 中聚合 JSON 对象

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


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


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


type Event struct {

    Place     string `json:"place"`

    Attendees string `json:"attendees"`

}

JSON字符串本身的位置Place和位置。Attendees我想以某种方式将它们标记为“已经编组”,这样它们就不会最终成为转义的 JSON 字符串,而是按原样使用。


有什么办法可以做到这一点?


肥皂起泡泡
浏览 213回答 2
2回答

慕侠2389804

您可以使用 json.RawMessageRawMessage 是一个原始编码的 JSON 对象。它实现了 Marshaler 和 Unmarshaler,可用于延迟 JSON 解码或预计算 JSON 编码。此外,json.RawMessage它是一个别名,[]byte因此您可以通过这种方式对其进行赋值:v := json.RawMessage(`{"foo":"bar"}`)例子:package mainimport (    "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"}}}

HUH函数

是的,您可以使用实现Marshaler接口的自定义类型。https://play.golang.org/p/YB_eKlfONDpackage mainimport (    "fmt"    "encoding/json")type Event struct {    Place     RawString  `json:"place"`    Attendees RawString  `json:"attendees,omitempty"`}type RawString stringfunc (s RawString) MarshalJSON() ([]byte, error) {    return []byte(s), nil}func main() {    event := Event{        Place: RawString(`{"name":"Paris"}`),        Attendees: RawString(`[{"name":"John"}, {"name":"Juli"}]`),    }    s, err := json.Marshal(event)    fmt.Println(fmt.Sprintf("event: %v; err: %v", string(s), err))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go