Maison > développement back-end > Golang > Comment désorganiser le JSON dynamique dans Go en fonction d'une clé de type sans champs génériques ?

Comment désorganiser le JSON dynamique dans Go en fonction d'une clé de type sans champs génériques ?

Patricia Arquette
Libérer: 2024-12-19 10:49:12
original
339 Les gens l'ont consulté

How to Unmarshal Dynamic JSON in Go Based on a Type Key Without Generic Fields?

Désagrégation du JSON dynamique basé sur une clé de type sans introduire de champs génériques

De nombreuses données JSON structurées nécessitent une désorganisation dans des structures Go, contenant souvent des champs imbriqués avec différents types de données. Lorsque le type de données d'un champ imbriqué varie en fonction d'une clé de type dans le JSON, les méthodes conventionnelles de désorganisation à l'aide de champs personnalisés peuvent conduire à un code passe-partout inutile.

Dans ce contexte, considérons la spécification JSON suivante :

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}
Copier après la connexion

et

{
  "some_data": "foo",
  "dynamic_field": { "type": "B", "address": "Somewhere" },
  "other_data": "bar"
}
Copier après la connexion

Ces deux documents JSON doivent être désorganisés dans le même Go struct :

type BigStruct struct {
  SomeData     string    `json:"some_data"`
  DynamicField Something `json:"dynamic_field"`
  OtherData    string    `json:"other_data"`
}
Copier après la connexion

Le défi réside dans la définition du type « Quelque chose » qui peut accueillir des données dynamiques en fonction de la clé « type » dans l'objet « dynamic_field ».

Pour éviter d'avoir besoin pour un champ « générique » explicite (par exemple, Valeur, Données), nous pouvons exploiter la puissance de l'intégration de types et interfaces.

type BigStruct struct {
  SomeData     string      `json:"some_data"`
  DynamicField DynamicType `json:"dynamic_field"`
  OtherData    string      `json:"other_data"`
}

type DynamicType struct {
  Value interface{}
}
Copier après la connexion

Dans le « DynamicType », le champ « Valeur » peut contenir tout type de données, en fonction de la clé « type » dans le JSON. Pour faciliter un bon désorganisation, nous implémentons la méthode UnmarshalJSON sur le 'DynamicType' :

func (d *DynamicType) UnmarshalJSON(data []byte) error {
    var typ struct {
        Type string `json:"type"`
    }
    if err := json.Unmarshal(data, &typ); err != nil {
        return err
    }
    switch typ.Type {
    case "A":
        d.Value = new(TypeA)
    case "B":
        d.Value = new(TypeB)
    }
    return json.Unmarshal(data, d.Value)
}
Copier après la connexion

Nous définissons des types spécifiques pour différents types de données :

type TypeA struct {
    Name string `json:"name"`
}

type TypeB struct {
    Address string `json:"address"`
}
Copier après la connexion

Avec cette approche, nous pouvons désorganisez les documents JSON sans avoir besoin d'un champ générique supplémentaire, ce qui nous permet de maintenir une structure de données propre et extensible.

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