我有以下的
JSON,我想解析成数组的类:
{ "1001": {"level":10,"monster-id": 1001,"skill-level": 1,"aimer-id": 301} "1002": {"level":12,"monster-id": 1002,"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”]
<<无效操作. type()的索引.
解决方法
这段代码有很多错误.首先,json是无效的json.您的顶级对象中的键对之间缺少逗号.我添加了逗号,并为您打印出来:
{ "1001":{ "level":10,"monster-id":1001,"skill-level":1,"aimer-id":301 },"1002":{ "level":12,"monster-id":1002,"aimer-id":302 },"1003":{ "level":16,"monster-id":1003,"skill-level":2,"aimer-id":303 } }
你的下一个问题(你所问的)是m:= data.(map [string] interface {})使m [map] interface {}.这意味着当你索引它,例如你的range循环中的v,类型是interface {}.您需要使用v.(map [string] interface {})键入断言,然后在每次从地图读取时键入断言.
我也注意到你下次尝试mc.Pool [i] =怪物当我是一个int和mc.Pool是一个地图[字符串]怪物. int不是该地图的有效键.
你的数据看起来很僵硬,所以我会做大部分的工作为你做.而不是提供一个map [string] interface {},你可以为它提供一个map [string]怪物.
这是一个简单的例子.除了改变解组的作用,我还添加了一个错误返回.错误返回对于查找错误很有用.那个错误返回是告诉我你有无效的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) }
我发布了一个工作示例来播放:http://play.golang.org/p/4EaasS2VLL