以下是从我正在调用的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响应解组到struct数组中:
var gods []God
json.Unmarshal(jsonResponse, &gods)
return gods
除了abilityDescription1(2,3,4,5)
以及该结构中的所有内容外,所有内容都正确编组。
有什么建议吗?
答案 0 :(得分:1)
使用struct标签将JSON字段名称映射到struct字段名称。
您的许多结构字段都是小写的,因此未导出,这意味着encoding / json包无法访问/编组。看看http://golang.org/pkg/reflect/#StructTag(JSON包将匹配“描述”和“描述”,但是 - 小写已经匹配)
你也最好(为了可读性/添加标签的能力)将你的结构分成单独的项目,然后嵌入它们。您有重复Rank_items
的情况,而您可以定义一次然后根据需要嵌入它:
e.g。
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
}