Maison  >  Article  >  développement back-end  >  Comment décoder JSON avec des structures imbriquées dynamiques dans Golang ?

Comment décoder JSON avec des structures imbriquées dynamiques dans Golang ?

DDD
DDDoriginal
2024-11-17 08:46:03467parcourir

How to Decode JSON with Dynamic Nested Structures in Golang?

Les structures dynamiques imbriquées JSON vont au décodage

Des rencontres surviennent souvent lorsque vous travaillez avec des données JSON contenant des noms de champs dynamiques ou inconnus dans des structures imbriquées. Cela peut poser un défi lorsque l'on tente de désérialiser et de traiter les données avec précision.

Exemples de données

Considérez les données JSON suivantes reçues après une requête du serveur :

{
    "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
}

Définitions de types personnalisés

Pour gérer cette structure dynamique, des définitions de types personnalisées peuvent être utilisées :

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"`
}

Utilisation de Maps

Étant donné que l'objet sms dans le JSON a des clés dynamiques, il peut être modélisé à l'aide d'une carte avec les numéros de téléphone comme clés et la structure SMSPhone comme valeurs :

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"`
}

Démarshaling

Avec les types personnalisés définis, les données peuvent être démarshalées comme suit :

var result SMSSendJSON

if err := json.Unmarshal([]byte(src), &result); err != nil {
    panic(err)
}
fmt.Printf("%+v", result)

Cela se traduira par un objet correctement désérialisé avec les numéros de téléphone dynamiques comme clés dans le result.Sms map.

Questions connexes

  • Comment analyser/désérialiser un JSON dynamique dans Golang
  • Comment démarshaler JSON avec inconnu noms de champs à structurer dans Golang ?
  • Désorganiser JSON avec des champs inconnus
  • Désorganiser la chaîne JSON en une structure qui a un élément de la structure elle-même

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