Unmarshalling an Array of Disparate Types in Go
When handling key-value pairs, unmarshalling is straightforward. However, unmarshalling an array of mixed types in a distinct order presents a challenge. Resolving this issue demands a solution that can accommodate varying data types in a flexible manner.
The Go programming language provides an elegant option for handling this scenario. By leveraging the interface{} type in conjunction with type assertion, we can dynamically analyze the underlying type of each array element and unmarshal accordingly.
Let's revisit the problematic code and modify it to harness this technique:
package main import ( "encoding/json" "fmt" ) func decodeJSON(f interface{}) { switch vf := f.(type) { case map[string]interface{}: fmt.Println("is a map:") for k, v := range vf { checkTypeAndDecode(k, v) } case []interface{}: fmt.Println("is an array:") for k, v := range vf { checkTypeAndDecode(k, v) } } } func checkTypeAndDecode(k string, v interface{}) { 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) decodeJSON(v) } } func main() { my_json := `{ "an_array":[ "with_a string", { "and":"some_more", "different":["nested", "types"] } ] }` var f interface{} err := json.Unmarshal([]byte(my_json), &f) if err != nil { fmt.Println(err) } else { fmt.Println("JSON:") decodeJSON(f) } }
This modified code employs the decodeJSON function to recursively analyze the JSON structure, identifying each element's data type and printing the appropriate representation. For complex nested structures, nested calls to decodeJSON are performed.
The output generated by this revised code illustrates how each element is correctly identified and printed based on its data type:
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"
With this enhanced understanding of type handling in Go, you can confidently unmarshal arrays containing a heterogeneous mix of data types, ensuring accurate and consistent data representation in your applications.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3