考慮遇到如下所示的嵌套JSON 結構的場景:
{ "outterJSON": { "innerJSON1": { "value1": 10, "value2": 22, "InnerInnerArray": [ "test1" , "test2"], "InnerInnerJSONArray": [ {"fld1" : "val1"} , {"fld2" : "val2"} ] }, "InnerJSON2":"NoneValue" } }
任務是有效地迭代此結構並將所有鍵值對作為字串檢索以進行進一步處理。不幸的是,為這樣的動態 JSON 輸入手動定義結構是不可行的。
為了有效地應對這一挑戰,採用了遞歸方法:
func parseMap(m map[string]interface{}) { for key, val := range m { // Check the type of the value switch concreteVal := val.(type) { case map[string]interface{}: // If it's a nested map, recursively call the function parseMap(val.(map[string]interface{})) case []interface{}: // If it's a nested array, call the function to parse the array parseArray(val.([]interface{})) default: // For all other types, print the key and value as a string fmt.Println(key, ":", concreteVal) } } }
這個遞歸函數 parseMap 檢查映射中每個值的類型。如果該值本身是一個映射,它會遞歸呼叫 parseMap 來遍歷該巢狀映射。如果該值是一個數組,它會呼叫 parseArray 來迭代它。對於所有其他類型(例如字串、數字等),它只是將鍵和值列印為字串。
考慮前面提供的範例 JSON 輸入。運行下面的程式碼將產生以下輸出:
func parseArray(a []interface{}) { for i, val := range a { // Check the type of the value switch concreteVal := val.(type) { case map[string]interface{}: // If it's a nested map, recursively call the function parseMap(val.(map[string]interface{})) case []interface{}: // If it's a nested array, call the function to parse the array parseArray(val.([]interface{})) default: // For all other types, print the index and value as a string fmt.Println("Index:", i, ":", concreteVal) } } } const input = ` { "outterJSON": { "innerJSON1": { "value1": 10, "value2": 22, "InnerInnerArray": [ "test1" , "test2"], "InnerInnerJSONArray": [{"fld1" : "val1"} , {"fld2" : "val2"}] }, "InnerJSON2":"NoneValue" } } `
輸出:
//outterJSON //innerJSON1 //InnerInnerJSONArray //Index: 0 //fld1 : val1 //Index: 1 //fld2 : val2 //value1 : 10 //value2 : 22 //InnerInnerArray //Index 0 : test1 //Index 1 : test2 //InnerJSON2 : NoneValue
這種方法有效地捕獲嵌套JSON 中的所有鍵值對,使其適合處理和Go 語言中的提取任務。
以上是如何在 Go 中高效地迭代巢狀 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!