Maison  >  Article  >  développement back-end  >  Mapper json à la structure avec des dictionnaires imbriqués

Mapper json à la structure avec des dictionnaires imbriqués

WBOY
WBOYavant
2024-02-09 13:46:231096parcourir

将 json 映射为具有嵌套字典的结构

php Editor Strawberry Mapper json dans une structure avec des dictionnaires imbriqués est une méthode courante de traitement des données. En convertissant les données json en un dictionnaire imbriqué, nous pouvons utiliser et accéder aux données plus facilement. La structure des dictionnaires imbriqués peut fournir une manière plus flexible d'organiser les données, nous permettant ainsi de traiter plus efficacement des structures de données complexes. Dans les applications pratiques, mapper json à des dictionnaires imbriqués peut nous aider à mieux comprendre et traiter les données, et à améliorer la lisibilité et la maintenabilité du code. Qu'il s'agisse du traitement des données JSON renvoyées par les API ou de l'analyse des fichiers de configuration, le mappage de JSON à des dictionnaires imbriqués est une technique courante de traitement des données.

Contenu des questions

Je suis nouveau sur Golang. J'ai un fichier json avec une structure imbriquée que je souhaite analyser et remplir.

J'essaie d'utiliser une structure de carte pour essayer de remplir. J'ai pu le faire avec des structures simples. Mais quand il s'agit de tableau de dictionnaire (clé : struct). map[string]接口{} 似乎因 runtime 错误而失败:索引超出范围.

J'ai essayé de faire ce qui suit avec l'exemple json ci-dessous.

type window struct {
    loc    []int
    wrtc   string
    label  string
}

type view struct {
    windows   []window
}

type views struct {
    views []view
}

type desktop struct {
    views                 []views  `mapstructure:views`
    rotation_speed        string   `mapstructure:"rotationspeed" json:rotationspeed"`
}

func main() {
        file, _ := ioutil.readfile("test.json")

        data := desktop{}

        _ = json.unmarshal([]byte(file), &data)

        fmt.println("data: ", data.views[0])
}
{
"desktop": {
    "view": [{// configs for view1
                 "random_id1": {
                         "loc": [0,0,640,360],
                         "wrtc": "some string",
                         "label": "window 1"
                 },
                 "random_id213443": {
                         "loc": [640,360,1280,720],
                         "wrtc": "some string blah",
                         "label": "window 2"
                 },
                 // more windows with random ids....
              },
              {
               // configs for view2...
              }
             ],
    "rotationSpeed": 30
}

Étant donné que l'identifiant de la fenêtre est aléatoire, je ne peux pas le définir dans la structure. J'ai essayé d'utiliser mapstruct:",squash" mais cela a également semblé échouer.

Merci beaucoup pour toute aide que vous pouvez apporter.

Solution

@burak serdar a raison

Vous n'avez pas besoin d'une structure de carte. json unmarshalling peut résoudre ce problème.

Il y a de nombreuses erreurs dans votre code, telles que la structure, la majuscule, les "vues", etc.

Voici la démo :

package main

import (
    "encoding/json"
    "fmt"
)

var data = `
{
    "desktop":{
        "view":[
            {
                "random_id1_1":{
                    "loc":[
                        0,
                        0,
                        640,
                        360
                    ],
                    "wrtc":"some string",
                    "label":"window 1"
                },
                "random_id1_2":{
                    "loc":[
                        640,
                        360,
                        1280,
                        720
                    ],
                    "wrtc":"some string blah",
                    "label":"window 2"
                }
            },
            {
                "random_id2_1":{
                    "loc":[
                        0,
                        0,
                        640,
                        360
                    ],
                    "wrtc":"some string",
                    "label":"window 1"
                },
                "random_id2_2":{
                    "loc":[
                        640,
                        360,
                        1280,
                        720
                    ],
                    "wrtc":"some string blah",
                    "label":"window 2"
                }
            }
        ],
        "rotationspeed":30
    }
}
`

type window struct {
    loc   []int
    wrtc  string
    label string
}

type desktop struct {
    view           []map[string]window
    rotation_speed int `json:"rotationspeed" mapstructure:"rotationspeed"`
}

type config struct {
    desktop desktop
}

func main() {
    c := config{}
    json.unmarshal([]byte(data), &c)
    fmt.println("json.unmarshal: ", c)
}
json.unmarshal:  {{[map[random_id1_1:{[0 0 640 360] some string window 1} random_id1_2:{[640 360 1280 720] some s
tring blah window 2}] map[random_id2_1:{[0 0 640 360] some string window 1} random_id2_2:{[640 360 1280 720] some
 string blah window 2}]] 30}}

Si vous souhaitez une view structure, vous pouvez également utiliser mapstruct via "remain"

type Window struct {
    Loc   []int
    Wrtc  string
    Label string
}

type View struct {
    Windows map[string]Window `mapstructure:",remain"`
}

type Desktop struct {
    View           []View
    Rotation_speed int `json:"rotationSpeed" mapstructure:"rotationSpeed"`
}

type Config struct {
    Desktop Desktop
}

func main() {
    c2 := Config{}
    m := map[string]interface{}{}
    _ = json.Unmarshal([]byte(data), &m)
    mapstructure.Decode(m, &c2)
    fmt.Println("mapstructure: ", c2)
}

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