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
DDDoriginal
2024-11-27 19:54:11784parcourir

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

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
}

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)
    }
}

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}]}]}

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