gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:13:45 29 4
gpt4 key购买 nike

我使用键值存储作为我的 golang 应用程序的后端,日期作为键(以保持条目排序)和 json 文档作为值。 json 的顶级命名空间 (foo) 以及 typedate 存在于我正在存储的每个 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"
}
}


当我从数据库中提取数据时,我做的第一件事是将每个条目解码到 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 数据)

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

a) 制作 json.RawMessage 的副本,如您所示(由 chendesheng 的回答)解码到界面中,然后一旦知道类型(从解码到界面中)就将副本解码到结构中?

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

最佳答案

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

  1. 将 json.RawMessage 解码为映射[字符串]接口(interface){}
  2. 使用正则表达式提取类型字符串

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

关于json - 在不知道结构的情况下解码嵌套的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30573899/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com