Немаршалинг ответа JSON в виде вложенной структуры во вложенную структуру
Вот пример JSON, возвращаемого из веб-API, который я вызываю:
{
"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)
и все в этой структуре.
Какие-либо предложения?
1 ответ
Используйте теги struct для сопоставления имен полей JSON со структурами имен полей.
Многие из ваших полей структуры являются строчными и поэтому не экспортируются, что означает, что пакет encoding/json не может получить к ним доступ / выполнить маршал. Взгляните на http://golang.org/pkg/reflect/ (хотя пакет 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
}