首页  >  文章  >  后端开发  >  如何高效解组未知结构的嵌套 JSON?

如何高效解组未知结构的嵌套 JSON?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-04 05:02:29346浏览

How to Unmarshall Nested JSON with Unknown Structure Efficiently?

解组具有未知结构的嵌套 JSON

在这种情况下,我们正在处理存储在键值中的具有未知结构的 JSON 数据店铺。从数据库检索条目时,我们最初解组为 map[string]*json.RawMessage 来处理顶级命名空间。然而,为了进一步解组嵌套数据,我们需要确定要使用的具体结构。

1.避免重复解组:

重复解组可能会影响性能。但是,根据数据结构和访问模式,这可能是必要的。如果解组速度至关重要,请考虑缓存解组结果。

2.确定结构类型:

方法 A:解组到接口

  • 将 json.RawMessage 解组到 map[string]interface{}。
  • 检查与“type”键关联的值。
  • 使用 switch 语句或反射来确定正确的结构。

方法 B:常规表达式

  • 使用正则表达式从 JSON 数据中提取“type”字符串。
  • 创建与可能的“type”字符串关联的结构类型映射。
  • 将 json.RawMessage 解组到相应的结构体。

示例:

方法 A:

<code class="go">type RawData struct {
    Id       string `json:"id"`
    Type      string `json:"type"`
    RawData   []int  `json:"rawdata"`
    Epoch     string `json:"epoch"`
}

// Unmarshal to interface
data := make(map[string]interface{})
json.Unmarshal(*objmap["foo"], &data)

// Determine struct type
switch data["type"] {
case "baz":
    baz := &RawData{}
    json.Unmarshal(*objmap["foo"], baz)
case "bar":
    bar := &BarData{}
    json.Unmarshal(*objmap["foo"], bar)
}

// Custom struct for nested data
type BarData struct {
    Id       string `json:"id"`
    Type      string `json:"type"`
    RawData   []QuxData  `json:"rawdata"`
    Epoch     string `json:"epoch"`
}

type QuxData struct{
    Key string `json:"key"`
    Values []int `json:"values`
}</code>

方法 B:

<code class="go">// Regular expression to extract type
typeRegex := regexp.MustCompile(`"type": "(.+?)"`)

// Get "type" string
typeString := string(typeRegex.Find(*objmap["foo"]))

// Map of struct types
structMap := map[string]interface{}{
    "baz": &RawData{},
    "bar": &BarData{},
}

// Unmarshal to corresponding struct
dataStruct := structMap[typeString]
json.Unmarshal(*objmap["foo"], dataStruct)</code>

通过实现这些方法中的任何一个,您可以确定将 json.RawMessage 解组到的正确结构,从而使您能够访问有效地嵌套数据。

以上是如何高效解组未知结构的嵌套 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn