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

标签 json encoding go decoding lossless

我想将 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/

相关文章:

json - R:JSON 向量到 data.frame

java - 如何使用特殊字符 "percentage"对 URL 进行编码?

encoding - 在 python 和 javascript 中生成 SHA256 哈希导致不同的结果

unit-testing - 模拟 Kafka API 以进行单元测试

go - 将 pubsub 与 golang 一起使用 : ocgrpc. NewClientStatsHandler

go - Go中的超时结构

jquery - json 以及如何使用它

sql - 如何在标准 SQL BigQuery 中解析 JSON?

ruby-on-rails - 在 Rails 中解析 JSON

JavaScript 编码无法正常工作