Maison >développement back-end >Golang >Comment gérer les chaînes JSON imbriquées lors du démarshalage dans Go ?

Comment gérer les chaînes JSON imbriquées lors du démarshalage dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-01 20:49:14375parcourir

How to Handle Nested JSON Strings When Unmarshaling in Go?

Désagrégation du JSON avec des chaînes imbriquées

Lorsque vous rencontrez une erreur indiquant "Impossible de désorganiser la chaîne dans le champ de structure Go", cela signifie que le JSON est analysé contient une valeur de chaîne dans un champ qui devrait être une structure. Pour résoudre ce problème, envisagez l'approche suivante :

import (
    "encoding/json"
    "fmt"
    "log"
)

type ManifestResponse struct {
    Name         string `json:"name"`
    Tag          string `json:"tag"`
    Architecture string `json:"architecture"`

    FsLayers []struct {
        BlobSum string `json:"blobSum"`
    } `json:"fsLayers"`

    History []struct {
        V1CompatibilityRaw string `json:"v1Compatibility"`
        V1Compatibility V1Compatibility
    } `json:"history"`
}

type V1Compatibility struct {
    ID              string `json:"id"`
    Parent          string `json:"parent"`
    Created         string `json:"created"`
}

func main() {
    exemplar := `{ "schemaVersion": 1,
   "name": "library/redis",
   "tag": "latest",
   "architecture": "amd64",
   "history": [
      {
         "v1Compatibility": "{\"id\":\"ef8a93741134ad37c834c32836aefbd455ad4aa4d1b6a6402e4186dfc1feeb88\",\"parent\":\"9c8b347e3807201285053a5413109b4235cca7d0b35e7e6b36554995cfd59820\",\"created\":\"2017-10-10T02:53:19.011435683Z\"}"
      }
   ]
}
`
    var jsonManResp ManifestResponse
    if err := json.Unmarshal([]byte(exemplar), &jsonManResp); err != nil {
        log.Fatal(err)
    }
    for i := range jsonManResp.History {
        var comp V1Compatibility
        if err := json.Unmarshal([]byte(jsonManResp.History[i].V1CompatibilityRaw), &comp); err != nil {
            log.Fatal(err)
        }
        jsonManResp.History[i].V1Compatibility = comp
    }
    fmt.Println(jsonManResp)
}

Dans ce code mis à jour, nous déclarons V1CompatibilityRaw en tant que champ de chaîne dans ManifestResponse.History, puis le désassemblons manuellement dans une structure V1Compatibility.

Cette approche permet une désérialisation appropriée de la réponse JSON dans la structure Go souhaitée, garantissant que la chaîne imbriquée est analysée correctement.

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