当前位置: 首页 > 知识库问答 >
问题:

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

尤钱明
2023-03-14

我使用键值存储作为我的Go语言应用程序的后端,日期作为键(保持条目排序),json文档作为值。json的顶级命名空间(foo)以及typedate存在于我存储的每个json文档中,但在其他方面存在一些差异(尤其是关于一些嵌套的json数据),所以当keyI从数据库中提取时,我真的不知道我在循环浏览的任何时间提取了什么。这是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"
  }
}


当我从数据库中提取数据时,我要做的第一件事是将每个条目解组到<code>map[string]*json中。RawMessage处理foonamespace

//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答案

然而,与SO答案不同,当我不得不再次解组< code>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-into(也允许嵌套json数据)

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

a) 制作json的副本。RawMessage,如您所示(通过陈德胜的回答)将其解组到接口中,然后在您知道类型后(从解组到该接口中)解组复制到结构中?

b)使用正则表达式来确定类型,然后在已知后散集到该类型的结构中

共有1个答案

柴衡
2023-03-14

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

    < li >解组json。map[string]接口{}的原始消息 < li >使用正则表达式提取类型字符串

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

 类似资料:
  • 问题内容: http://play.golang.org/p/f6ilWnWTjm 我正在尝试解码以下字符串,但仅获取空值。 如何在Go中解码嵌套的JSON结构? 我想将以下内容转换为地图数据结构。 问题答案: 在Go中使用嵌套结构来匹配JSON中的嵌套结构。 这是一个如何处理示例JSON的示例: 游乐场链接 您还可以对内部结构使用匿名类型: 游乐场链接 或外部和内部结构: 游乐场链接 如果您不知

  • 问题内容: 我试图解析Java中的JSON字符串并找到键值对,以便我可以确定JSON对象的近似结构,因为JSON字符串的对象结构是未知的。 例如,一个执行可能具有这样的JSON字符串: 另一个像这样: 如何遍历各种JSON元素并确定键及其值?我看着的。我知道如何获取下一个“令牌”并确定令牌的类型(即字段名称,值,数组开头等),但是,我不知道如何获取实际令牌的值。 例如: 或其他库(或)中是否有一个

  • 本文向大家介绍MySQL在不知道列名情况下的注入详解,包括了MySQL在不知道列名情况下的注入详解的使用技巧和注意事项,需要的朋友参考一下 前言 最近感觉脑子空空,全在为了刷洞去挖洞,还是回归技术的本身让自己舒服些。好了,下面话不多说了,来一起看看详细的介绍吧 前提 以下情况适用于 MySQL < 5版本,或者在 MySQL >= 5 的版本[存在information_schema库],且已获取

  • 我知道协议缓冲区是一种序列化格式,需要中的消息格式。proto,以便正确读回。但我有一个文件,我不知道正确的消息格式,因为它没有发布。我想做的是自己对数据进行反向工程,这样我就可以重建消息。为此,我需要读取原始文件,从中可以提取字段编号、类型和值。 有没有一个程序可以做到这一点(最好是在python中,但C/C也很酷)?

  • 问题内容: 我正在使用gob将结构序列化到磁盘。有问题的结构包含一个接口字段,因此具体类型需要使用进行注册。 这里的难题是,进行灌装的图书馆应忽略所使用的混凝土类型。我希望即使调用者定义了自己的接口实现,也可以进行序列化。 我可以通过动态注册类型来成功编码数据(请参见下面的简单示例),但是在尝试重新读取数据时,gob拒绝接受未注册的类型。它令人沮丧,因为感觉好像所有数据都在那里- 如果gob 标记

  • 我想将带入原型。事先不知道它是什么类型的消息。 为了添加更多细节,我知道编码类型/消息可以是的类型集。(它们都是在我自己的proto文件中声明并内置到Go二进制文件中的类型。) 我想看看是否有可能获取一个字节数组并从中重建原始消息。 我写了这个演示:https://play.golang.org/p/WF9KpTlZnp7如果我传递描述符,我可以将其解码为Dynamicpb,并从任何返回消息。