我想将 JSON blob 解码为 Go 结构,对其进行操作,然后将其编码回 JSON。但是,JSON 中有一些与我的结构无关的动态字段,我想在序列化回 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?
我知道一种可能性是将所有内容解码为 map[string]interface{}
但是男孩,这样做会变得丑陋。
有什么方法可以两全其美?
最佳答案
使用 encoding/json
无法解码结构并将未知字段保存在同一级别以进行后重新编码。您可以做的是选择不使用 json.RawMessage 解码结构的一部分。类型,大致如下:
type Person struct {
Name string
Address json.RawMessage
}
您可以通过实现自己的Unmarshaler 来解决这个问题。将文档解码为映射并将未知键保存在结构的字段中,然后有一个对应的Marshaler在编码之前将字段放回原处。
出于好奇,您正在寻找的功能确实存在于 labix.org/v2/mgo/bson 中,通过 inline tag flag ,目标是精确解决您描述的用例。
关于json - 在 Go 中维护未解析的 JSON 字段的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18769014/