Maison >développement back-end >Golang >Comment puis-je désorganiser un tableau JSON avec des types de données mixtes dans Go ?

Comment puis-je désorganiser un tableau JSON avec des types de données mixtes dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-14 05:00:09354parcourir

How Can I Unmarshal a JSON Array with Mixed Data Types in Go?

Désorganisation d'un tableau de types divers

Dans la gestion JSON, la désorganisation de tableaux avec des types d'éléments variés peut être difficile. Cet article aborde le problème de la désorganisation des tableaux composés d'éléments avec des types de données connus mais non triés.

Méthode de Go pour le décodage arbitraire des données

Comme indiqué dans la documentation officielle de Go sur JSON encodage, il est possible de décoder des données arbitraires dans une interface{} à l'aide de la fonction json.Unmarshal. En utilisant l'assertion de type, le type de données peut être déterminé dynamiquement.

Adaptation de votre code

La version modifiée suivante de votre code présente cette approche :

package main

import (
    "encoding/json"
    "fmt"
)

var my_json string = `{
    "an_array":[
    "with_a string",
    {
        "and":"some_more",
        "different":["nested", "types"]
    }
    ]
}`

func IdentifyDataTypes(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)
                IdentifyDataTypes(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)
                IdentifyDataTypes(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: ")
        IdentifyDataTypes(f)
    }
}

Sortie

Le code produit ce qui suit sortie :

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"

Cette approche permet une identification et une gestion dynamiques des types d'éléments au sein du tableau, offrant une solution polyvalente pour vos besoins de désorganisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn