为了账号安全,请及时绑定邮箱和手机立即绑定

在不知道结构的情况下解组嵌套的 json

在不知道结构的情况下解组嵌套的 json

Go
长风秋雁 2021-10-11 10:41:50
我使用键值存储作为我的 golang 应用程序的后端,日期作为键(保持条目排序)和 json 文档作为值。的JSON的顶层名字空间(foo),并且type和date 各自的JSON文档我存储但除此之外也有一些差异(特别是相对于一些嵌套JSON数据)在本,所以当keyI'm从数据库中提取,我真的不知道我在循环的任何时候都在拉出什么。这是json数据的示例{  "foo": {    "id": "124",    "type": "baz",    "rawdata": [      123,      345,      345    ],    "epoch": "1433120656704"  }}{  "foo": {    "id": "234",    "type": "bar",    "rawdata": [      {        "key": "dog",        "values": [          123,          234        ]      },      {        "key": "cat",        "values": [          23,          45        ]      }    ],    "epoch": "1433120656705"  }}当我从数据库中提取时,我做的第一件事就是将每个条目解组到 a 中map[string]*json.RawMessage以处理foo命名空间//as I'm looping through the entries in the database   var objmap map[string]*json.RawMessage   if err := json.Unmarshal(dbvalue, &objmap); err !=nil{       return err   }这要归功于这个SO answer但是,与那个 SO 答案不同,当我必须再次解组foo命名空间下包含的任何内容时,我不知道要解组到哪个结构中   if err :=json.Unmarshal(*objmap["foo"], &bazorbar; err != nil{         return err   } type Baz struct{  Id string `json:"id"`  Type string `json:"type"`  RawData []int `json:"rawdata"`  Epoch string  `json:"epoch"`}type Bar struct{  Id string `json:"id"`  Type string `json:"type"`  RawData []*Qux `json:"rawdata"`  Epoch string  `json:"epoch"`}//nested inside Bartype Qux struct{  Key string `json:"key"`  Values []int `json:"values`}两部分问题:有没有办法避免重复解组(或者我什至不应该关心的事情)我怎样才能弄清楚将 json.RawMessage 解组到哪个结构中(这也允许嵌套的 json 数据)更新: @chendesheng 提供的初始答案使我能够找出类型,但一旦确定该类型(我需要这样做),就不会再次将其解组到结构中,因此基于对他/她的评论中的对话回答,我会对这两种可能性中的任何一种感兴趣a) 制作 json.RawMessage 的副本,如您所示(通过 chendesheng 的回答)解组到接口中,然后在知道类型后将副本解组到结构中(从解组到接口中)?b) 使用正则表达式来确定类型,然后在已知后解组为该类型的结构
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信