Maison >développement back-end >Golang >Comment sérialiser et désérialiser des tableaux JSON hétérogènes dans Go ?

Comment sérialiser et désérialiser des tableaux JSON hétérogènes dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 14:57:10463parcourir

How to Serialize and Deserialize Heterogeneous JSON Arrays in Go?

Sérialisation de tableaux JSON hétérogènes dans Go

Dans Go, sérialisation de tableaux JSON hétérogènes (contenant un mélange de chaînes, de chiffres et de caractères Unicode) pose un défi en raison de l'interdiction du langage sur les tranches de type mixte. Considérez la structure JSON souhaitée suivante :

{
    results: [
        ["ooid1", 2.0, "Söme text"],
        ["ooid2", 1.3, "Åther text"],
    ]
}

Sérialisation avec une interface Marshaler

Pour personnaliser la sérialisation, nous pouvons implémenter l'interface json.Marshaler pour notre type de ligne. Nous utiliserons une tranche intermédiaire d'interface{} pour encoder les valeurs hétérogènes :

package main

import (
    "encoding/json"
    "fmt"
)

type Row struct {
    Ooid  string
    Score float64
    Text  string
}

func (r *Row) MarshalJSON() ([]byte, error) {
    arr := []interface{}{r.Ooid, r.Score, r.Text}
    return json.Marshal(arr)
}

Dans cet exemple, la méthode MarshalJSON convertit la ligne en un tableau de types mixtes.

Désérialisation avec une interface Unmarshaler

Nous pouvons de la même manière implémenter l'interface json.Unmarshaler pour déstructurer les valeurs hétérogènes :

func (r *Row) UnmarshalJSON(bs []byte) error {
    arr := []interface{}{}
    json.Unmarshal(bs, &arr)
    r.Ooid = arr[0].(string)
    r.Score = arr[1].(float64)
    r.Text = arr[2].(string)
    return nil
}

Cette méthode reconvertit les octets JSON dans notre structure Row.

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