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

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

WBOY
WBOYavant
2024-02-06 08:15:09406parcourir

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}]}}

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


}

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)

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

fmt.println(object)

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"

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)
}

Vous obtiendrez le résultat :

add
123
[{csharp codename [2]} {golang coding [3]}]

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

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer