Maison > développement back-end > Golang > Utiliser struct pour analyser le json imbriqué dans le langage go

Utiliser struct pour analyser le json imbriqué dans le langage go

WBOY
Libérer: 2024-02-06 08:15:09
avant
430 Les gens l'ont consulté

Utiliser struct pour analyser le json imbriqué dans le langage go

Contenu de la question

Impossible d'utiliser go lang pour analyser le json imbriqué dans un objet de structure

J'ai une chaîne json imbriquée et je souhaite l'analyser à l'aide de structures en langage go. json ressemble à ça

{"action":"add","business":{"listid":123,"objecttags":[{"tagcode":"csharp","tagname":"codename","tagvalue":["2"],"tagtype":3},{"tagcode":"golang","tagname":"coding","tagvalue":["3"],"tagtype":3}]}}
Copier après la connexion

Je souhaite analyser JSON en utilisant le langage Go. json a une structure imbriquée, j'ai donc créé la structure mentionnée dans le code suivant

package main

import (
    "encoding/json"
    "fmt"
)


type objecttagslist struct {
    tagcode  string
    tagname  string
    tagvalue []string
}

type model struct {
    action   string `json:"action"`
    business struct {
        listid     int64  `json:"listid"`
        objecttags []objecttagslist `json:"objecttags"`
    } `json:"business"`
}

func main() {
    json := `{"action":"add","business":{"listid":123,"objecttags":[{"tagcode":"csharp","tagname":"codename","tagvalue":["2"],"tagtype":3},{"tagcode":"golang","tagname":"coding","tagvalue":["3"],"tagtype":3}]}}`

    var model model
    json.unmarshal([]byte(json), &model)

    fmt.println(model.action) // this prints correctly as "add"
        fmt.println(model.business.listid) // this prints correctly as "123"


    fmt.println(model.business.objecttags) // this does not print the objecttags. rather this prints the objecttags as "[{  []} {  []}]"


}
Copier après la connexion

Je n'arrive pas à obtenir la valeur du json imbriqué interne dans la structure.

J'ai également essayé de déballer à nouveau la structure interne

var object []objecttagslist

//this gives error as cannot convert model.business.objecttags (variable of type []objecttagslist) to type []byte

json.unmarshal([]byte(model.business.objecttags), &object)
Copier après la connexion

//Erreur, model.business.objecttags (variable de type []objecttagslist) ne peut pas être converti en type []byte

fmt.println(object)
Copier après la connexion

Cela me donne une erreur Impossible de convertir model.business.objecttags (variable de type []objecttagslist) en type []byte.

Comment mapper ce json dans une structure ? Je veux le cartographier de manière à pouvoir utiliser des objets comme

model.Business.ObjectTags[0].tagCode //--> Should print/store "csharp"
model.Business.ObjectTags[0].tagValue[0] //--> Should print/store "2"
Copier après la connexion

Veuillez aider


Réponse correcte


Vous ne pouvez rassembler/désorganiser que les champs "exportés" - c'est-à-dire les champs accessibles en dehors du package actuel, ce qui signifie "champs commençant par une lettre majuscule". Donc si vous deviez modifier votre code pour ressembler à ceci :

package main

import (
    "encoding/json"
    "fmt"
)

type objecttagslist struct {
    tagcode  string
    tagname  string
    tagvalue []string
}

type model struct {
    action   string `json:"action"`
    business struct {
        listid     int64            `json:"listid"`
        objecttags []objecttagslist `json:"objecttags"`
    } `json:"business"`
}

func main() {
    json := `
{
  "action": "add",
  "business": {
    "listid": 123,
    "objecttags": [
      {
        "tagcode": "csharp",
        "tagname": "codename",
        "tagvalue": [
          "2"
        ],
        "tagtype": 3
      },
      {
        "tagcode": "golang",
        "tagname": "coding",
        "tagvalue": [
          "3"
        ],
        "tagtype": 3
      }
    ]
  }
}
`

    var model model
    json.unmarshal([]byte(json), &model)

    fmt.println(model.action)
    fmt.println(model.business.listid)

    fmt.println(model.business.objecttags)
}
Copier après la connexion

Vous obtiendrez le résultat :

add
123
[{csharp codename [2]} {golang coding [3]}]
Copier après la connexion

Ici, nous profitons du fait que json 模块会自动将名为 tagcode 的键映射到名为 tagcode est un champ de structure, mais en réalité, nous devons être clairs :

type ObjectTagsList struct {
    TagCode  string   `json:"tagCode"`
    TagName  string   `json:"tagName"`
    TagValue []string `json:"tagValue"`
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal