我正在创建一个Go服务,它从不同的源收集JSON对象,并将它们聚合在一个JSON对象中。
我想知道是否有任何方法可以聚合子对象而无需再次解组和重新编组它们或者必须手动构建JSON字符串。
我正在考虑使用包含已经编组的部分的Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae
odio quis felis consectetur blandit. Etiam mattis vehicula ex id
sodales. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
fermentum semper nisi vel aliquam. Ut nec facilisis lectus. Maecenas
auctor blandit condimentum. Donec finibus orci ac imperdiet congue.
Pellentesque sem leo, commodo non metus ac, posuere maximus lorem. Class
aptent taciti sociosqu ad litora torquent per conubia nostra, per
inceptos himenaeos.
,例如:
struct
type Event struct {
Place string `json:"place"`
Attendees string `json:"attendees"`
}
和Place
本身就是JSON字符串。我想以某种方式将它们标记为“已经编组”,因此它们不会以转义的JSON字符串结尾,而是按原样使用。
有没有办法实现这个目标?
答案 0 :(得分:4)
您可以使用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"}}
}
答案 1 :(得分:3)
是的,您可以使用实现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))
}