Maison >développement back-end >Golang >Comment convertir dynamiquement YAML en JSON en Go sans structures prédéfinies ?

Comment convertir dynamiquement YAML en JSON en Go sans structures prédéfinies ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-28 14:57:14510parcourir

How to Dynamically Convert YAML to JSON in Go without Predefined Structs?

Convertir YAML en JSON dynamiquement sans structure définie

Vous disposez d'une chaîne de configuration YAML dynamique que vous souhaitez convertir en JSON. Cependant, vous ne pouvez pas définir de structure pour le JSON car la structure des données est inconnue.

Pour surmonter ce défi, vous pouvez utiliser la fonction yaml.Unmarshal() pour analyser le YAML en une valeur d'interface{}. Cela produira une structure de données imbriquée de cartes et de tranches avec le type interface{} par défaut.

Le problème survient lorsque vous essayez de reconvertir cette valeur d'interface{} en JSON à l'aide de json.Marshal(). Cela échouera car json.Marshal() ne prend pas en charge le type map[interface{}]interface{}.

Pour gérer cette structure de données dynamique, vous devez convertir de manière récursive l'interface map[interface{}] {} valeurs pour mapper les valeurs de [string]interface{}. Cela garantit que toutes les cartes ont des clés de chaîne, qui sont prises en charge par JSON.

Voici un exemple de fonction de conversion :

func convert(i interface{}) interface{} {
    switch x := i.(type) {
    case map[interface{}]interface{}:
        m2 := map[string]interface{}{}
        for k, v := range x {
            m2[k.(string)] = convert(v)
        }
        return m2
    case []interface{}:
        for i, v := range x {
            x[i] = convert(v)
        }
    }
    return i
}

À l'aide de cette fonction, vous pouvez convertir la valeur de l'interface{} en une valeur Structure de données compatible JSON :

body = convert(body)

Maintenant, vous pouvez utiliser json.Marshal() pour convertir le corps converti en JSON string.

Voici un exemple complet :

func main() {
    const s = `Services:
-   Orders:
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111
`
    var body interface{}
    if err := yaml.Unmarshal([]byte(s), &body); err != nil {
        panic(err)
    }

    body = convert(body)

    if b, err := json.Marshal(body); err != nil {
        panic(err)
    } else {
        fmt.Printf("Output: %s\n", b)
    }
}

Sortie :

Output: {"Services":[{"Orders":[{"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},{"ID":"$save ID2","SupplierOrderCode":111111}]}]}

Notez que l'ordre des éléments dans la sortie JSON peut différer du YAML d'origine en raison à la nature désordonnée des cartes Go.

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