登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-12 22:36:56 386浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《在不知道结构的情况下解组嵌套的 json》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到golang等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我使用键值存储作为我的 golang 应用程序的后端,日期作为键(以保持条目排序),json 文档作为值。foojson ( )的顶级命名空间和typeanddate 存在于我存储的每个 json 文档中,但除此之外存在一些差异(尤其是对于一些嵌套的 json 数据),所以当我从数据库中提取 key 时,我真的不知道我在循环的任何时候都在拉出什么。这是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"
  }
}

当我从数据库中提取数据时,我做的第一件事就是将每个条目解组为 amap[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
   }

多亏了这个[答案](https://stackoverflow.com/questions/11066946/partly-json-unmarshal- into-a-map-in-go)

但是,与那个 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 Bar
type Qux struct{
  Key string `json:"key"`
  Values []int `json:"values`
}

两部分问题:

  1. 有没有办法避免重复解组(或者这是我什至不应该关心的事情)
  2. 如何确定将 json.RawMessage 解组到哪个结构(这也允许嵌套的 json 数据)

更新: @chendesheng 提供的初始答案使我能够找出类型,但一旦确定类型(我需要这样做)就不会再次解组到结构中,因此基于对他/她的评论中的对话回答,我会对这些可能性中的任何一种感兴趣

a) 制作 json.RawMessage 的副本,如您所显示的那样解组到接口中(通过 chendesheng 的回答),然后在知道类型后解组该结构的副本(从解组到接口中)?

b)使用正则表达式来确定类型,然后在知道后解组为该类型的结构

正确答案

检查结构类型的两种方法:

  1. 将 json.RawMessage 解组到 map[string]interface{}
  2. 使用正则表达式提取类型字符串

http://play.golang.org/p/gfP6P4SmaC

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在不知道结构的情况下解组嵌套的 json》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>