ホームページ >バックエンド開発 >Golang >JSON を Go 構造体の配列に効率的にアンマーシャリングする方法は?

JSON を Go 構造体の配列に効率的にアンマーシャリングする方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-02 10:11:14723ブラウズ

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

Go で JSON をオブジェクトの配列にアンマーシャリングする

JSON オブジェクトをカスタム構造体の配列に解析しようとすると、問題が発生します。ただし、指定した JSON は、最上位オブジェクトのキーと値のペアの間にカンマがないため、無効であるようです。修正され、フォーマットされた 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
   }
}

型アサーションを使用した解析

JSON アンマーシャリングの結果として得られたマップをインターフェースに割り当てたため、JSON を解析しようとした最初の試行でエラーが発生しました。{}価値。このマップにインデックスを付けるときは、マップからキーを取得するたびに、v.(map[string]interface{}) を使用して値を再度アサートする必要があります。

さらに、int を挿入しようとしました。文字列をキーとして持つマップのキーとして使用すると、さらにエラーが発生します。

効率的なアンマーシャリング

アンマーシャリング プロセスを簡素化し、手動による型アサーションを回避するには、ターゲット データ型を直接アンマーシャリングする手法を使用できます。更新された例は次のとおりです:

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

以上がJSON を Go 構造体の配列に効率的にアンマーシャリングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。