在Go中维护未解析的JSON字段的最佳方法是什么?

Joe*_*haw 9 encoding json decoding go lossless

我想将JSON blob解码为Go结构,对其进行操作,然后将其编码回JSON.但是,JSON中的动态字段与我的struct无关,我想在序列化回JSON时维护它们.

例如:

{ "name": "Joe Smith", 
  "age": 42, 
  "phone": "614-555-1212", 
  "debug": True, 
  "codeword": "wolf" }

type Person struct {
    Name string
    Age uint
    Phone string
}

var p Person
json.Unmarshal(data, &p)
// Happy birthday
p.Age++
data, _ = json.Marshal(p)

// Any way to maintain the "debug" and "codeword" fields -- which might not
// be known ahead of time?
Run Code Online (Sandbox Code Playgroud)

我知道有一种可能性就是将所有东西都解码成一个map[string]interface{}男孩,当你这样做时,事情变得丑陋.

有没有办法让两全其美?

Gus*_*yer 6

由于encoding/json没有办法解码结构并在同一级别保存未知字段以进行后重新编码.你可以做的是选择不使用json.RawMessage类型解码部分结构,类似于:

type Person struct {
    Name    string
    Address json.RawMessage
}
Run Code Online (Sandbox Code Playgroud)

您可以通过实现自己的Unmarshaler解决方法,将文档解码为地图并将未知密钥保存在结构的字段中,然后让对应的Marshaler在编组之前将字段放回.

出于好奇,您正在寻找的功能确实存在于labix.org/v2/mgo/bson中,通过内联标记标记,目标是精确地解决您正在描述的用例.