How to Unmarshal a Go Array with Disparate Data Types?
Dec 14, 2024 am 02:28 AMUnmarshalling 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.
The above is the detailed content of How to Unmarshal a Go Array with Disparate Data Types?. For more information, please follow other related articles on the PHP Chinese website!

Hot Article

Hot tools Tags

Hot Article

Hot Article Tags

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Go language pack import: What is the difference between underscore and without underscore?

How to implement short-term information transfer between pages in the Beego framework?

How do I write mock objects and stubs for testing in Go?

How can I use tracing tools to understand the execution flow of my Go applications?

How to convert MySQL query result List into a custom structure slice in Go language?

How can I define custom type constraints for generics in Go?

How to write files in Go language conveniently?

How do I write benchmarks that accurately reflect real-world performance in Go?
