在Go中聚合JSON对象

时间:2016-06-01 15:49:39

标签: json go marshalling

我正在创建一个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字符串结尾,而是按原样使用。

有没有办法实现这个目标?

2 个答案:

答案 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))
}