2014-02-20 24 views
2

这里的样品JSON从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)和everythi正确编组在该结构中。

有什么建议吗?

+0

貌似不同之处在于名称:'Item_description' vs'itemDescription' – Verran

+0

仍然没有任何约束力。如果是这样,为什么'Mana_per_five'正确绑定到原始JSON名称:'ManaPerFive'?试图理解 - 谢谢! – sergserg

+0

当我尝试它时,它似乎有所作为。如果你将'Item_description'切换到'ItemDescription',那么这些字段在解组后被填充。在这个游乐场查看它:http://play.golang.org/p/1ktuaOCpcI – Verran

回答

1

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

许多结构字段都是小写字母,因此未导出,这意味着encoding/json软件包不能访问/编入它们。看看http://golang.org/pkg/reflect/#StructTag(JSON包将与“说明”匹配“描述”,尽管 - 即小写字母已经匹配)

您也更好(为了可读性/添加标签的能力)将您的构成单独的项目,然后嵌入它们。您有重复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 
    }