请参阅此博客条目,该条目彻底涵盖了该主题,尤其是“ 解码任意数据
”部分。使用它,您可以执行以下操作:(游乐场示例)
package mainimport ( "encoding/json" "fmt" )func main() { // Creating the maps for JSON m := map[string]interface{}{} // Parsing/Unmarshalling JSON encoding/json err := json.Unmarshal([]byte(input), &m) if err != nil { panic(err) } parseMap(m)}func parseMap(aMap map[string]interface{}) { for key, val := range aMap { switch concreteval := val.(type) { case map[string]interface{}: fmt.Println(key) parseMap(val.(map[string]interface{})) case []interface{}: fmt.Println(key) parseArray(val.([]interface{})) default: fmt.Println(key, ":", concreteval) } }}func parseArray(anArray []interface{}) { for i, val := range anArray { switch concreteval := val.(type) { case map[string]interface{}: fmt.Println("Index:", i) parseMap(val.(map[string]interface{})) case []interface{}: fmt.Println("Index:", i) parseArray(val.([]interface{})) default: 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
关键是在使用接口类型时必须使用类型断言。使用类型开关可以轻松确定所需的类型。该代码将递归地遍历任何嵌套数组或映射,因此您可以根据需要添加任意多个级别并获取所有值。



