请问Golang应该如何处理复杂json类型的数据?

> 类型1
{
  "id":1,

  "result": [{
    "topics": ["bbbbbbbb"],
    "payload": "aaaaa...",
    ...//多字段
    }]
}

类型2
{
   id:2,
  "result": ["aaaaaaaaaa"]
}

类型3
{
   id:2,
  "result": ["aaaaaaaaaa", "bbbbbbbbbbb"]
}

type Contents struct{
    Result interface{}
}

请问应该如何定义 Result 的类型来兼容这三种类型的json?

Result map[string]interface{}    // 这种类型能够处理多层嵌套的json但是无法处理 单个值的json
xuri
最佳答案

如果是网络请求的响应结果,数据结构尽可能应该统一,JSON 数组中的子类型数据结构可通过工具 JSON-to-Go https://mholt.github.io/json-to-go 自动生成;如果无法统一子类型,取值时需要对 interface 做类型推断。

1年前 评论
讨论数量: 7
xuri

如果是网络请求的响应结果,数据结构尽可能应该统一,JSON 数组中的子类型数据结构可通过工具 JSON-to-Go https://mholt.github.io/json-to-go 自动生成;如果无法统一子类型,取值时需要对 interface 做类型推断。

1年前 评论
xuri

如果是网络请求的响应结果,数据结构尽可能应该统一,JSON 数组中的子类型数据结构可通过工具 JSON-to-Go https://mholt.github.io/json-to-go 自动生成;如果无法统一子类型,取值时需要对 interface 做类型推断。

1年前 评论

interface{}难道不可以?

1年前 评论

有个库叫做gjson可以处理

1年前 评论

看业务,最好可以写专门的struct

1年前 评论

可以使用iterator或gjson

1年前 评论
zhuzixian520

结构体也是可以嵌套的

1年前 评论

github.com/json-iterator/go 性能接近原生(go的原生库随着go的迭代性能已经很强了)
github.com/tidwall/gjson 提供了 get 接口和 Unmarshal 到 map 的接口,但没有提供 Unmarshal 到 struct 的接口
github.com/bytedance/sonic 字节跳动出品,性能杠杠的(由于底层基于汇编进行开发,sonic 当前仅支持 amd64 架构下的 darwin/linux 平台 ,后续会逐步扩展到其它操作系统及架构)。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!