解组具有未知结构的嵌套 JSON
在这种情况下,我们正在处理存储在键值中的具有未知结构的 JSON 数据店铺。从数据库检索条目时,我们最初解组为 map[string]*json.RawMessage 来处理顶级命名空间。然而,为了进一步解组嵌套数据,我们需要确定要使用的具体结构。
1.避免重复解组:
重复解组可能会影响性能。但是,根据数据结构和访问模式,这可能是必要的。如果解组速度至关重要,请考虑缓存解组结果。
2.确定结构类型:
方法 A:解组到接口
方法 B:常规表达式
示例:
方法 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中文网其他相关文章!