只要我有键值对解组是非常简单的,但是我将如何以不同的顺序解组不同类型的数组?单个元素是明确定义和已知的,但顺序不是.
我无法想出一个美丽的解决方案.
我会尝试错误的所有元素吗?
是否有某种联合类型可以为我做这个?
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 and GO的很好的文章.可以将“任意数据”解码为接口{},并使用类型断言来动态地确定类型.
package main import ( "encoding/json" "fmt" ) var my_json string = `{ "an_array":[ "with_a string",{ "and":"some_more","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",vv) default: fmt.Printf("%v: ",k) WTHisThisJSON(v) } } case []interface{}: fmt.Println("is an array:") for k,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","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"
它还不完整,但显示它将如何工作.