Maison > développement back-end > Golang > Comment convertir efficacement YAML en JSON avec des données dynamiques et sans structures ?

Comment convertir efficacement YAML en JSON avec des données dynamiques et sans structures ?

DDD
Libérer: 2024-11-27 19:54:11
original
717 Les gens l'ont consulté

How to Efficiently Convert YAML to JSON with Dynamic Data and No Structs?

Conversion YAML en JSON pour les données dynamiques sans structures

Lorsque vous traitez des données dynamiques qui ne peuvent pas être mappées à une structure, conversion de YAML en JSON peut poser des défis. Considérez la chaîne YAML suivante :

Services: 
-   Orders: 
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111
Copier après la connexion

Pour convertir cette chaîne YAML en JSON, une approche consiste à la désorganiser en un type interface{}. Cependant, cela entraîne des types non pris en charge, car le type par défaut utilisé pour désassembler les paires clé-valeur est map[interface{}]interface{}.

Pour résoudre ce problème, nous devons convertir le map[interface{ }]interface{} pour mapper les valeurs de [string]interface{} de manière récursive. Voici une fonction qui effectue cette 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

En utilisant cette fonction, nous pouvons convertir la chaîne YAML en JSON comme suit :

import (
    "encoding/json"
    "fmt"
    "github.com/go-yaml/yaml"
)

const s = `Services:
-   Orders:
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111
`

func main() {
    fmt.Printf("Input: %s\n", s)
    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 :

Input: Services:
-   Orders:
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111

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

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal