Maison >développement back-end >Golang >Comment désérialiser JSON avec des noms dynamiques dans des structures imbriquées dans Go ?

Comment désérialiser JSON avec des noms dynamiques dans des structures imbriquées dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-22 21:24:15966parcourir

How to Deserialize JSON with Dynamic Names in Nested Structures in Go?

Décodage des structures dynamiques imbriquées en JSON avec Go

Cet article aborde le défi de la désérialisation des données JSON qui comportent des noms dynamiques dans des structures imbriquées. Examinons le problème et proposons une solution.

Énoncé du problème

Considérez la réponse JSON suivante :

{
    "status": "OK",
    "status_code": 100,
    "sms": {
        "79607891234": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        },
        "79035671233": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        },
        "79105432212": {
            "status": "ERROR",
            "status_code": 203,
            "status_text": "Нет текста сообщения"
        }
    },
    "balance": 2676.18
}

struct :

type SMSPhone struct {
    Status     string `json:"status"`
    StatusCode int    `json:"status_code"`
    StatusText string `json:"status_text"`
}

type SMSSendJSON struct {
    Status     string     `json:"status"`
    StatusCode int        `json:"status_code"`
    Sms        []SMSPhone `json:"sms"`
    Balance    float64    `json:"balance"`
}

Le problème se pose en raison des numéros de téléphone dynamiques comme noms de propriété dans le "sms" objet.

Solution

Pour gérer cette situation, nous pouvons utiliser une carte pour représenter l'objet "sms" en JSON :

type SMSPhone struct {
    Status     string `json:"status"`
    StatusCode int    `json:"status_code"`
    StatusText string `json:"status_text"`
}

type SMSSendJSON struct {
    Status     string              `json:"status"`
    StatusCode int                 `json:"status_code"`
    Sms        map[string]SMSPhone `json:"sms"`
    Balance    float64             `json:"balance"`
}

Maintenant, le code de désérialisation ressemble à ceci :

var result SMSSendJSON

if err := json.Unmarshal([]byte(src), &result); err != nil {
    panic(err)
}

Cette approche nous permet de traiter correctement les structures dynamiques imbriquées dans Allez-y.

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