只要我有键值对,解组就非常简单了,但是我将如何以不同的顺序解组不同类型的数组呢?单个元素定义明确且已知,但顺序不明确。
我无法提出一个漂亮的解决方案。
我会尝试对所有元素进行错误处理吗?是否有某种工会类型可以为我做到这一点?
游乐场版
package main import ( "encoding/json" "fmt" ) var my_json string = `{ "an_array":[ "with_a string", { "and":"some_more", "different":["nested", "types"] } ] }` type MyInner struct { And string Different []string } type MyJSON struct { An_array []json.RawMessage } func main() { var my_json_test MyJSON e := json.Unmarshal([]byte(my_json), &my_json_test) if e != nil { fmt.Println(e) } else { for index, value := range my_json_test.An_array { fmt.Println("index: ", index) fmt.Println("value: ", string(value)) } var my_inner MyInner err := json.Unmarshal(my_json_test.An_array[1], &my_inner) if err != nil { fmt.Println(err) } else { fmt.Println("inner structure: ", my_inner) } } }
Go官方博客上有一篇不错的文章encoding/json:JSON和GO。可以将“任意数据解码”到接口{}中,并使用类型断言来动态确定类型。
encoding/json
您的代码可能可以修改为:
package main import ( "encoding/json" "fmt" ) var my_json string = `{ "an_array":[ "with_a string", { "and":"some_more", "different":["nested", "types"] } ] }` func WTHisThisJSON(f interface{}) { switch vf := f.(type) { case map[string]interface{}: fmt.Println("is a map:") for k, v := range vf { switch vv := v.(type) { case string: fmt.Printf("%v: is string - %q\n", k, vv) case int: fmt.Printf("%v: is int - %q\n", k, vv) default: fmt.Printf("%v: ", k) WTHisThisJSON(v) } } case []interface{}: fmt.Println("is an array:") for k, v := range vf { switch vv := v.(type) { case string: fmt.Printf("%v: is string - %q\n", k, vv) case int: fmt.Printf("%v: is int - %q\n", k, vv) default: fmt.Printf("%v: ", k) WTHisThisJSON(v) } } } } func main() { fmt.Println("JSON:\n", my_json, "\n") var f interface{} err := json.Unmarshal([]byte(my_json), &f) if err != nil { fmt.Println(err) } else { fmt.Printf("JSON: ") WTHisThisJSON(f) } }
它给出的输出如下:
JSON: { "an_array":[ "with_a string", { "and":"some_more", "different":["nested", "types"] } ] } JSON: is a map: an_array: is an array: 0: is string - "with_a string" 1: is a map: and: is string - "some_more" different: is an array: 0: is string - "nested" 1: is string - "types"
尚未完成,但显示了它如何工作。