”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Go 中将嵌套 JSON 解组到对象数组中?

如何在 Go 中将嵌套 JSON 解组到对象数组中?

发布于2024-12-21
浏览:808

How to Unmarshal Nested JSON into an Array of Objects in Go?

将嵌套 JSON 解组到 Go 中的对象数组中

问题

考虑以下 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 解组为 Monster 对象数组。

type Monster struct {
    MonsterId  int32
    Level      int32
    SkillLevel int32
    AimerId    int32
}

解决方案

要实现此目的,请按照下列步骤操作:

  1. 定义 MonsterCollection: 创建一个 MonsterCollection 类型来保存 Monster 的地图带有字符串键的对象。
type MonsterCollection struct {
    Pool map[string]Monster
}
  1. 实现 FromJson 方法: 在 MonsterCollection 类型上定义 FromJson 方法来处理解组。
func (mc *MonsterCollection) FromJson(jsonStr string) error {
    var data *map[string]Monster
    b := []byte(jsonStr)
    return json.Unmarshal(b, &data)
}
  • 使用 var data *map[string]Monster 避免使用 interface{},确保生成的映射具有所需的类型。
  • 将数据作为指针传递可确保解组期间所做的更改会反映在 MonsterCollection 的池字段中。
  1. 正确的密钥类型in Pool: 将 Pool 映射的键类型更改为字符串,以匹配 JSON 数据中的键。
  2. 使用结构标签: 将 JSON 结构标签添加到 Monster 结构中指定 JSON 数据中的字段名称。
type Monster struct {
    MonsterId  int32 `json:"monster-id"`
    Level      int32 `json:"level"`
    SkillLevel int32 `json:"skill-level"`
    AimerId    int32 `json:"aimer-id"`
}
  1. Call FromJson: 使用 JSON 字符串调用 FromJson 方法,将数据解组到 MonsterCollection 中。
mc := new(MonsterCollection)
err := mc.FromJson(jsonStr)
  1. 检查错误: 处理 FromJson 返回的任何错误以进行调试。
  2. 访问对象: 使用 MonsterCollection 的 Pool 字段来访问各个 Monster 对象。
for id, monster := range mc.Pool {
    fmt.Println(id, monster)
}

按照以下步骤,您可以成功地将嵌套的 JSON 数据解组到 Go 中的 Monster 对象数组中。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3