在沒有結構知識的情況下解組嵌套JSON
問題陳述
處理嵌套JSON 資料時,確定要解組到的適當結構可能具有挑戰性。對於儲存在鍵值儲存中的資料尤其如此,其中 JSON 資料的結構可能差異很大。
問題 1:避免重複解組
而重複解組可能會產生一些效能開銷,但不一定要避免,除非它成為重大瓶頸。
問題2:確定結構類型
有兩個確定結構類型的主要方法:
方法1:解組到介面
方法 2:使用正規表示式
確定結構類型後,您可以解組資料:
varbazorbar interface{} if err := json.Unmarshal(*objmap["foo"], &bazorbar); err !=nil{ return err } switch v := bazorbar.(type) { case map[string]*json.RawMessage: // If the data is a nested JSON object, further unmarshaling is needed. result, err := unmarshalNested(v["nested_data"]) if err != nil return err foo.Nested_Data = result case []interface{}: // If the data is an array of JSON objects, process each element. for _, item := range v { result, err := unmarshalNested(item.(map[string]interface{})) if err != nil return err foo.Nested_Array = append(foo.Nested_Array, result) } }
範例程式碼:
// Unmarshals nested JSON data. func unmarshalNested(data map[string]interface{}) (interface{}, error) { type_expr := regexp.MustCompile(`"type":\s*"([a-zA-Z]+)"`) matches := type_expr.FindStringSubmatch(data["foo"].(string)) if len(matches) == 2 { switch matches[1] { case "Baz": var baz Baz if err := json.Unmarshal([]byte(data["foo"].(string)), &baz); err != nil { return nil, err } return baz, nil case "Bar": var bar Bar if err := json.Unmarshal([]byte(data["foo"].(string)), &bar); err != nil { return nil, err } return bar, nil } } return nil, errors.New("cannot determine type") }
以上是如何在不知道其結構的情況下解組嵌套 JSON 資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!