首页 >后端开发 >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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn