处理动态 JSON 模式解码

Posted

技术标签:

【中文标题】处理动态 JSON 模式解码【英文标题】:Handling dynamic JSON schema decoding 【发布时间】:2021-09-27 16:05:50 【问题描述】:

我有一个 Go HTTP 客户端,它发送/解析 JSON-RPC 请求。

HTTP POST 请求:

[
   "id":"1", "method":"action1","params":[],
   "id":"2", "method":"action2","params":[],
   ...
   "id":"X", "method":"actionX","params":[]
]

HTTP 响应:

[
   "id":"1", "error":null, "result":...,
   "id":"2", "error":null, "result":...,
   ...
   "id":"X", "error":null, "result":...
]

如何处理 result 键是具有动态架构的对象的那些负载,具体取决于键 id 的值。

【问题讨论】:

【参考方案1】:

您可以通过将结果解组为 json.RawMessage 来指示 json 库不要解组结果字段,在这种情况下,将响应解组为:

type result struct
    ID     string          `json:"id"`
    Err    *string         `json:"error"` // maybe a string?
    Result json.RawMessage `json:"result"`

然后,当您知道您正在处理的 ID 时,您可以将 result.ID 解组到另一个具有您期望的结构的结构中。

【讨论】:

超级简洁的东西是这种类型只是引擎盖下的一个字节切片type RawMessage []byte

以上是关于处理动态 JSON 模式解码的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中动态解码任意 json 字段

如何在 Swift 中使用动态键(在根级别)解码此 JSON?

如何在 Swift 4 中为 JSON 编写可解码,其中键是动态的?

无返回时处理 JSON 解码错误

Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)

Golang处理JSON--- 解码