Maison >développement back-end >Golang >Comment convertir en toute sécurité YAML en JSON en Go sans perdre l'intégrité des données ?

Comment convertir en toute sécurité YAML en JSON en Go sans perdre l'intégrité des données ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-01 18:02:12202parcourir

How to Safely Convert YAML to JSON in Go Without Losing Data Integrity?

Conversion de YAML en JSON sans liaison de structure

Lorsque vous travaillez avec des données dynamiques au format YAML, il est souvent nécessaire de les convertir en JSON pour un traitement ultérieur. Cependant, la désorganisation directe de YAML dans une interface vide{} peut entraîner des problèmes lors de la rencontre de types map[interface{}]interface{}, comme démontré dans le scénario donné.

Solution : conversion de type récursive

Pour résoudre ce problème, une fonction récursive appelée convert() est utilisée. Cette fonction parcourt la valeur interface{} et effectue les conversions suivantes :

  • Convertit les valeurs map[interface{}]interface{} en map[string]interface{}.
  • Convertit les valeurs []interface{} en []interface{}.

Ce faisant, la valeur générée peut être marshalée en toute sécurité dans un Chaîne JSON.

Exemple

Voici un exemple d'utilisation de la fonction convert() :

import (
    "fmt"
    "log"

    "github.com/go-yaml/yaml"
    "encoding/json"
)

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
}

func main() {
    // Define the YAML string
    const s = `Services:
    -   Orders: 
        -   ID: $save ID1
            SupplierOrderCode: $SupplierOrderCode
        -   ID: $save ID2
            SupplierOrderCode: 111111
    `

    // Unmarshal the YAML string into an empty interface
    var body interface{}
    if err := yaml.Unmarshal([]byte(s), &body); err != nil {
        log.Fatal(err)
    }

    // Recursively convert the interface to a map[string]interface{}
    body = convert(body)

    // Marshal the converted interface into a JSON string
    if b, err := json.Marshal(body); err != nil {
        log.Fatal(err)
    } else {
        fmt.Println("Converted JSON:", string(b))
    }
}

Sortie

La sortie du le programme est le converti JSON :

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

Notes

  • En convertissant en cartes Go, l'ordre des éléments est perdu, il peut donc ne pas convenir aux scénarios où l'ordre est important.
  • Une version optimisée et améliorée de la fonction convert() a été publiée sous forme de bibliothèque sur github.com/icza/dyno. Il offre commodité et flexibilité pour gérer les données YAML dynamiques.

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