首页  >  文章  >  后端开发  >  在不知道其结构的情况下如何解组嵌套的 JSON 数据?

在不知道其结构的情况下如何解组嵌套的 JSON 数据?

Patricia Arquette
Patricia Arquette原创
2024-11-02 16:55:03321浏览

How can I unmarshal nested JSON data without knowing its structure?

在没有已知结构的情况下解组嵌套 JSON

当遇到没有定义结构的嵌套 JSON 数据时,有多种方法可以缓解解组中的挑战。

避免重复解组

通常建议尽量减少解组操作。考虑实现缓存机制来存储未编组的对象以供将来使用,并避免重复的编组。然而,在某些情况下,可能需要多次解组,尤其是在处理不同类型的嵌套结构时。

确定解组的正确结构

方法1:解组到map[string]interface{}

将json.RawMessage解组到map[string]interface{}。这允许检查嵌套结构以识别类型,并随后识别要解组到的正确结构。

示例:

<code class="go">var objMap map[string]interface{}
json.Unmarshal(rawMessage, &objMap)</code>

方法 2 :正则表达式匹配

使用正则表达式来匹配JSON数据中的类型字符串。一旦知道类型,请使用反射或类型开关将其解组到相应的结构中。

示例:

<code class="go">type Regex *regexp.Regexp

// Split the JSON data into key-value pairs
type KeyValue struct {
    Key   string
    Value string
}

// Regex for extracting the type
var typeRE = Regex(regexp.MustCompile(`(?m)^.*"type": "(.+)".*$`))

// Unmarshal the raw message and extract the type
func getType(rawMessage []byte) (string, error) {
    var data KeyValue
    err := json.Unmarshal(rawMessage, &data)
    if err != nil {
        return "", err
    }
    matches := typeRE.FindStringSubmatch(data.Value)
    return matches[1], nil
}</code>

使用复制或常规表达式方法

方法 A:复制和解组

  1. 创建 json.RawMessage 的副本。
  2. 解组副本转换为 interface{} 来识别类型。
  3. 将原始 json.RawMessage 解组到确定类型的结构中。

方法 B:正则表达式和解组

  1. 使用正则表达式确定类型。
  2. 使用反射或类型开关创建具有确定类型的结构体的新实例。
  3. 将 json.RawMessage 解组到新创建的结构中。

以上是在不知道其结构的情况下如何解组嵌套的 JSON 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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