Maison >développement back-end >Golang >Comment désorganiser efficacement JSON dans un tableau de structures Go ?

Comment désorganiser efficacement JSON dans un tableau de structures Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-02 10:11:14788parcourir

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

Désorganisation de JSON dans un tableau d'objets dans Go

Vous rencontrez un défi en essayant d'analyser un objet JSON dans un tableau de structures personnalisées . Le JSON que vous avez fourni semble cependant invalide car il manque des virgules entre les paires clé-valeur dans l'objet de niveau supérieur. Voici le JSON corrigé et formaté :

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

Analyse avec les assertions de type

Votre première tentative d'analyse du JSON a rencontré une erreur car vous avez attribué la carte résultant de la désorganisation du JSON à une interface{} valeur. Lors de l'indexation de cette carte, vous devez saisir à nouveau assert la valeur avec v.(map[string]interface{}) et chaque fois que vous récupérez une clé de la carte.

De plus, vous avez tenté d'insérer un int comme clé d'une carte avec des chaînes comme clés, ce qui entraînerait une erreur supplémentaire.

Unmarshalling efficace

Pour simplifier le unmarshalling traiter et éviter les assertions de type manuelles, vous pouvez utiliser une technique dans laquelle vous fournissez directement la désorganisation avec le type de données cible. Voici un exemple mis à jour :

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

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