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
Libérer: 2024-11-28 14:57:14
original
513 Les gens l'ont consulté

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
}
Copier après la connexion

À 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)
Copier après la connexion

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)
    }
}
Copier après la connexion

Sortie :

Output: {"Services":[{"Orders":[{"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},{"ID":"$save ID2","SupplierOrderCode":111111}]}]}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal