我有以下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} }
这是我想做的但失败的事情:
type Monster struct { MonsterId int32 Level int32 SkillLevel int32 AimerId int32 } type MonsterCollection struct { Pool map[string]Monster } func (mc *MonsterCollection) FromJson(jsonStr string) { var data interface{} b := []byte(jsonStr) err := json.Unmarshal(b, &data) if err != nil { return } m := data.(map[string]interface{}) i := 0 for k, v := range m { monster := new(Monster) monster.Level = v["level"] monster.MonsterId = v["monster-id"] monster.SkillLevel = v["skill-level"] monster.AimerId = v["aimer-id"] mc.Pool[i] = monster i++ } }
编译器抱怨v [“ level”] <<无效操作。interface()类型的索引。
此代码中有许多错误。首先,json是无效的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 } }
你的下一个问题(你问的那个)是m := data.(map[string]interface{})做m一个map[string]interface{}。这意味着当您v在范围循环中对它进行索引时,类型为interface{}。您需要使用再次键入assert v.(map[string]interface{}),然后每次从地图上读取时都键入assert。
m := data.(map[string]interface{})
m
map[string]interface{}
v
interface{}
v.(map[string]interface{})
我还注意到,mc.Pool[i] = monster当我是int且mc.Pool是map [string] Monster时,您下次尝试。整数不是该映射的有效键。
mc.Pool[i] = monster
您的数据看起来非常僵化,所以我会让unmarshall为您完成大部分工作。您可以为它提供一个map [string] Monster,而不是为其提供map [string] interface {}。
这是一个简单的例子。除了更改解组的工作方式之外,我还添加了一个错误返回。错误返回对于发现错误很有用。该错误返回告诉我您的json无效。
type Monster struct { MonsterId int32 `json:"monster-id"` Level int32 `json:"level"` SkillLevel int32 `json:"skill-level"` AimerId int32 `json:"aimer-id"` } type MonsterCollection struct { Pool map[string]Monster } func (mc *MonsterCollection) FromJson(jsonStr string) error { var data = &mc.Pool b := []byte(jsonStr) return json.Unmarshal(b, data) }
我在goplay上发布了一个工作示例:http://play.golang.org/p/4EaasS2VLL