Heim  >  Artikel  >  Backend-Entwicklung  >  Ordnen Sie JSON einer Struktur mit verschachtelten Wörterbüchern zu

Ordnen Sie JSON einer Struktur mit verschachtelten Wörterbüchern zu

WBOY
WBOYnach vorne
2024-02-09 13:46:231096Durchsuche

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

php Editor Strawberry Mapping von JSON in eine Struktur mit verschachtelten Wörterbüchern ist eine gängige Datenverarbeitungsmethode. Durch die Konvertierung von JSON-Daten in ein verschachteltes Wörterbuch können wir die Daten bequemer bedienen und darauf zugreifen. Die Struktur verschachtelter Wörterbücher kann eine flexiblere Möglichkeit zur Datenorganisation bieten und es uns ermöglichen, komplexe Datenstrukturen effizienter zu verarbeiten. In praktischen Anwendungen kann uns die Zuordnung von JSON zu verschachtelten Wörterbüchern dabei helfen, Daten besser zu verstehen und zu verarbeiten sowie die Lesbarkeit und Wartbarkeit des Codes zu verbessern. Unabhängig davon, ob von APIs zurückgegebene JSON-Daten verarbeitet oder Konfigurationsdateien analysiert werden, ist die Zuordnung von JSON zu verschachtelten Wörterbüchern eine gängige Datenverarbeitungstechnik.

Frageninhalt

Ich bin neu bei Golang. Ich habe eine JSON-Datei mit einer verschachtelten Struktur, die ich analysieren und füllen möchte.

Ich versuche, eine Kartenstruktur zum Ausfüllen zu verwenden. Dies gelang mir mit einfachen Strukturen. Aber wenn es um das Wörterbucharray (Schlüssel: Struktur) geht. map[string]接口{} 似乎因 runtime 错误而失败:索引超出范围.

Ich habe versucht, Folgendes mit dem JSON-Beispiel unten zu tun.

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
}

Da die Fenster-ID zufällig ist, kann ich sie nicht in der Struktur definieren. Ich habe es mit mapstruct:",squash" versucht, aber auch das schien fehlgeschlagen zu sein.

Vielen Dank für jede Hilfe, die Sie leisten können.

Lösung

@burak serdar hat recht

Sie benötigen keine Kartenstruktur. JSON-Unmarshalling kann dieses Problem lösen.

Ihr Code enthält viele Fehler, z. B. Struktur, Groß- und Kleinschreibung, „Ansichten“ usw.

Hier ist die Demo:

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

Wenn Sie eine view Struktur wünschen, können Sie Mapstruct auch über „remain“ verwenden

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

Das obige ist der detaillierte Inhalt vonOrdnen Sie JSON einer Struktur mit verschachtelten Wörterbüchern zu. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen