json - 将嵌套 JSON 响应解码为嵌套结构

标签 json go unmarshalling

这是从我正在调用的 Web API 返回的示例 JSON:

{
    "Ability1": "Noxious Fumes",
    "AbilityId1": 7812,
    "AttackSpeed": 0.86,
    "Cons": "",
    "HP5PerLevel": 0.47,
    "Health": 360,
    "Speed": 350,
    "abilityDescription1": {
      "itemDescription": {
        "cooldown": "12s",
        "cost": "60/70/80/90/100",
        "description": "Agni summons a cloud of noxious fumes at his ground target location, doing damage every second. Firing any of Agni's abilities into the fumes detonates the gas, stunning all enemies in the radius.",
        "menuitems": [
          {
            "description": "Ability:",
            "value": "Ground Target"
          },
          {
            "description": "Affects:",
            "value": "Enemy"
          },
          {
            "description": "Damage:",
            "value": "Magical"
          },
          {
            "description": "Radius:",
            "value": "20"
          }
        ],
        "rankitems": [
          {
            "description": "Damage per Tick:",
            "value": "10/20/30/40/50 (+5% of your magical power)"
          },
          {
            "description": "Fumes Duration:",
            "value": "10s"
          },
          {
            "description": "Stun Duration:",
            "value": "1s"
          }
        ],
        "secondaryDescription": ""
      }
    },
    "abilityDescription5": {
      "itemDescription": {
        "cooldown": "",
        "cost": "",
        "description": "After hitting with 4 basic attacks, Agni will gain a buff. On the next cast of Flame Wave or Rain Fire, all enemies hit by those abilities will be additionally set ablaze, taking damage every .5s for 3s.",
        "menuitems": [
          {
            "description": "Affects:",
            "value": "Enemy"
          },
          {
            "description": "Damage:",
            "value": "Magical"
          }
        ],
        "rankitems": [
          {
            "description": "Damage per Tick:",
            "value": "5 (+10% of your magical power)"
          }
        ],
        "secondaryDescription": ""
      }
    },
    "basicAttack": {
      "itemDescription": {
        "cooldown": "",
        "cost": "",
        "description": "",
        "menuitems": [
          {
            "description": "Damage:",
            "value": "34 + 1.5/Lvl (+20% of Magical Power)"
          },
          {
            "description": "Progression:",
            "value": "None"
          }
        ],
        "rankitems": [],
        "secondaryDescription": ""
      }
    },
    "id": 1737,
    "ret_msg": null
  }

还有我的结构:

type God struct {
    Ability1                      string
    Ability2                      string
    Ability3                      string
    Ability4                      string
    Ability5                      string
    AbilityId1                    int
    AbilityId2                    int
    AbilityId3                    int
    AbilityId4                    int
    AbilityId5                    int
    Attack_speed                  float64
    Attack_speed_per_level        float64
    Cons                          string
    Hp5_per_level                 float64
    Health                        int
    Health_per_five               int
    Health_per_level              int
    Item1                         string
    Item2                         string
    Item3                         string
    Item4                         string
    Item5                         string
    Item6                         string
    Item7                         string
    Item8                         string
    Item9                         string
    ItemId1                       int
    ItemId2                       int
    ItemId3                       int
    ItemId4                       int
    ItemId5                       int
    ItemId6                       int
    ItemId7                       int
    ItemId8                       int
    ItemId9                       int
    Lore                          string
    Mp5_per_level                 float64
    Magic_protection              int
    Magic_protection_per_level    int
    Mana                          int
    Mana_per_five                 float64
    Mana_per_level                int
    Name                          string
    On_free_rotation              string
    Pantheon                      string
    Physical_power                int
    Physical_power_per_level      int
    Physical_protection           int
    Physical_protection_per_level float64
    Pros                          string
    Roles                         string
    Speed                         int
    Title                         string
    Type                          string
    Abilitydescription1           struct {
        Item_description struct {
            Cooldown    string
            Cost        string
            Description string
            Menu_items  struct {
                Description string
                Value       string
            }
            Rank_items struct {
                Description string
                Value       string
            }
            Secondary_description string
        }
    }
    Ability_description2 struct {
        Item_description struct {
            Cooldown    string
            Cost        string
            Description string
            Menu_items  struct {
                Description string
                Value       string
            }
            Rank_items struct {
                Description string
                Value       string
            }
            Secondary_description string
        }
    }
    Ability_description3 struct {
        Item_description struct {
            Cooldown    string
            Cost        string
            Description string
            Menu_items  struct {
                Description string
                Value       string
            }
            Rank_items struct {
                Description string
                Value       string
            }
            Secondary_description string
        }
    }
    Ability_description4 struct {
        Item_description struct {
            Cooldown    string
            Cost        string
            Description string
            Menu_items  struct {
                Description string
                Value       string
            }
            Rank_items struct {
                Description string
                Value       string
            }
            Secondary_description string
        }
    }
    Ability_description5 struct {
        Item_description struct {
            Cooldown    string
            Cost        string
            Description string
            Menu_items  struct {
                Description string
                Value       string
            }
            Rank_items struct {
                Description string
                Value       string
            }
            Secondary_description string
        }
    }
    Basic_attack struct {
        Item_description struct {
            cooldown    string
            cost        string
            description string
            Menu_items  struct {
                Description string
                Value       string
            }
            Rank_items struct {
                Description string
                Value       string
            }
            Secondary_description string
        }
    }
    Id      int
    Ret_msg string
}

下面是我如何将 JSON 响应解码到结构数组中:

var gods []God
json.Unmarshal(jsonResponse, &gods)
return gods

abilityDescription1(2,3,4,5) 和该结构中的所有内容外,所有内容均已正确编码。

有什么建议吗?

最佳答案

使用结构标签将 JSON 字段名称映射到结构字段名称。

您的许多结构字段都是小写的,因此未导出,这意味着 encoding/json 包无法访问/编码它们。看看http://golang.org/pkg/reflect/#StructTag (尽管 JSON 包会将“Description”与“description”匹配 - 即小写字母已经匹配)

你也最好(为了可读性/添加标签的能力)将你的结构拆分成单独的项目,然后嵌入它们。在某些情况下,您会重复 Rank_items,而您可以定义一次,然后根据需要将其嵌入:

例如

   Basic_attack struct {
        ItemDescription ItemDesc `json:"itemDescription"`
        Menu []MenuItems `json:"menuitems"`
        Rank []RankItems  `json:"rankitems"`
   }

   ItemDesc struct {
        Cooldown    string `json:"cooldown"`
        Cost        string `json:"cost"`
        Description string `json:"description"`
        Menu        []MenuItems `json:"menuitems"`
        ...
   }

   MenuItems  struct {
            Description string 
            Value       string
  }

   RankItems struct {
                Description string
                Value       string
   }

关于json - 将嵌套 JSON 响应解码为嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895743/

相关文章:

python - 在变量中保存对 python 字典(来自 json 文件)项的引用

json - 具有未知键的 Unmarshall JSON 上的空结构

c# - 无法在 C# 中将临时文档上传到 Adob​​e Sign

Kendo 序列化的 Javascript 数组网格对象属性在服务器上为空

java - Jackson ObjectMapper 用方括号包裹每个元素(即使是单个值)

go - 在开放端口上打开 URL

go - COM 中的 UTF-16 字符串

json - 在 http 响应中将任意字符串编码为 JSON

java - JAXB2 类型限制不起作用?

java - 如何在 Spring 集成中解码 Xml 负载后保留 JMS header