unmarshal嵌套json,不知道结构

时间:2015-06-01 12:47:13

标签: go

我使用键值存储作为我的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"}}

当我从数据库中撤出时,我要做的第一件事是将每个条目解组为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 Bar
type Qux struct{
  Key string `json:"key"`
  Values []int `json:"values`
}

两部分问题:

  1. 有没有办法避免重复的解组(或者是我不应该关心的事情)
  2. 如何确定将json.RawMessage解组为哪个结构(也允许嵌套的json数据)
  3. 更新: @chendesheng提供的初始答案使我能够找到类型,但一旦确定了该类型(我需要做),就不会再解组成结构,所以基于在对他/她的回答的评论中的对话中,我会对这些可能性中的任何一种感兴趣

    a)制作一个json.RawMessage的副本,在你显示的界面中解组(通过chendesheng的回答),然后一旦你知道了类型(从解组到界面中)就解组了它的结构吗?< / p>

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

2 个答案:

答案 0 :(得分:7)

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

  1. 将json.RawMessage解组为map [string] interface {}
  2. 使用正则表达式提取类型字符串
  3. http://play.golang.org/p/gfP6P4SmaC

答案 1 :(得分:-1)

我现在已经将这种库用于此类场景近3年了

https://github.com/bitly/go-simplejson

相关问题