Heim >Backend-Entwicklung >Golang >Wie kann JSON effizient in ein Array von Go-Strukturen entmarshaliert werden?

Wie kann JSON effizient in ein Array von Go-Strukturen entmarshaliert werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-02 10:11:14723Durchsuche

How to Efficiently Unmarshal JSON into an Array of Go Structs?

JSON in ein Array von Objekten in Go entmarshallen

Sie stoßen auf eine Herausforderung, wenn Sie versuchen, ein JSON-Objekt in ein Array von benutzerdefinierten Strukturen zu analysieren . Das von Ihnen bereitgestellte JSON scheint jedoch ungültig zu sein, da es im Objekt der obersten Ebene keine Kommas zwischen Schlüssel-Wert-Paaren gibt. Hier ist der korrigierte und formatierte JSON:

{
   "1001":{
      "level":10,
      "monster-id":1001,
      "skill-level":1,
      "aimer-id":301
   },
   "1002":{
      "level":12,
      "monster-id":1002,
      "skill-level":1,
      "aimer-id":302
   },
   "1003":{
      "level":16,
      "monster-id":1003,
      "skill-level":2,
      "aimer-id":303
   }
}

Parsing mit Typzusicherungen

Beim ersten Versuch, den JSON zu parsen, ist ein Fehler aufgetreten, weil Sie die aus dem JSON-Unmarshalling resultierende Karte einer Schnittstelle zugewiesen haben{} Wert. Wenn Sie diese Karte indizieren, müssen Sie den Wert erneut mit v.(map[string]interface{}) eingeben und jedes Mal, wenn Sie einen Schlüssel aus der Karte abrufen.

Außerdem haben Sie versucht, eine int einzufügen als Schlüssel einer Karte mit Zeichenfolgen als Schlüssel, was zu einem weiteren Fehler führen würde.

Effizientes Unmarshalling

Zur Vereinfachung des Um den Unmarshalling-Prozess zu vereinfachen und manuelle Typzusicherungen zu vermeiden, können Sie eine Technik verwenden, bei der Sie das Unmarshalling direkt mit dem Zieldatentyp bereitstellen. Hier ist ein aktualisiertes Beispiel:

package main

import (
    "encoding/json"
)

type Monster struct {
    MonsterId  int32 `json:"monster-id"`
    Level      int32 `json:"level"`
    SkillLevel int32 `json:"skill-level"`
    AimerId    int32 `json:"aimer-id"`
}

type MonsterCollection struct {
    Pool map[string]Monster
}

func (mc *MonsterCollection) FromJson(jsonStr string) error {
    var data = &mc.Pool
    b := []byte(jsonStr)
    return json.Unmarshal(b, data)
}

func main() {
    jsonString := `{
        "1001":{
            "level":10,
            "monster-id":1001,
            "skill-level":1,
            "aimer-id":301
        },
        "1002":{
            "level":12,
            "monster-id":1002,
            "skill-level":1,
            "aimer-id":302
        },
        "1003":{
            "level":16,
            "monster-id":1003,
            "skill-level":2,
            "aimer-id":303
        }
    }`

    mc := MonsterCollection{}
    if err := mc.FromJson(jsonString); err != nil {
        // Handle error
    }

    for _, monster := range mc.Pool {
        // Access monster data here
    }
}

Das obige ist der detaillierte Inhalt vonWie kann JSON effizient in ein Array von Go-Strukturen entmarshaliert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn