Home >Backend Development >Golang >How to Unmarshal a Go Array with Disparate Data Types?

How to Unmarshal a Go Array with Disparate Data Types?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-14 02:28:09630browse

How to Unmarshal a Go Array with Disparate Data Types?

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.

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn