为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中聚合 JSON 对象

在 Go 中聚合 JSON 对象

Go
肥皂起泡泡 2022-01-17 10:27:43
我正在制作一个从不同来源收集 JSON 对象并将它们聚合到单个 JSON 对象中的 Go 服务。我想知道是否有任何方法可以聚合子对象,而不必再次解组和重新编组它们,也不必手动构建 JSON 字符串。我正在考虑使用struct包含已经编组的部分,例如:type Event struct {    Place     string `json:"place"`    Attendees string `json:"attendees"`}JSON字符串本身的位置Place和位置。Attendees我想以某种方式将它们标记为“已经编组”,这样它们就不会最终成为转义的 JSON 字符串,而是按原样使用。有什么办法可以做到这一点?
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

您可以使用 json.RawMessage


RawMessage 是一个原始编码的 JSON 对象。它实现了 Marshaler 和 Unmarshaler,可用于延迟 JSON 解码或预计算 JSON 编码。


此外,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"}}

}


查看完整回答
反对 回复 2022-01-17
?
HUH函数

TA贡献1836条经验 获得超4个赞

是的,您可以使用实现Marshaler接口的自定义类型。


https://play.golang.org/p/YB_eKlfOND


package main


import (

    "fmt"

    "encoding/json"

)


type Event struct {

    Place     RawString  `json:"place"`

    Attendees RawString  `json:"attendees,omitempty"`

}


type RawString string


func (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))

}


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号