我有以下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 [“级别”] <<无效的操作。 interface()的索引。
答案 0 :(得分:19)
此代码中有许多错误。首先,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{}
。您需要使用v.(map[string]interface{})
再次键入断言,然后在每次从地图中读取时键入断言。
我还注意到,当我是一个int时你下次尝试mc.Pool[i] = monster
而mc.Pool是一个map [string] Monster。 int不是该映射的有效密钥。
您的数据看起来非常严格,所以我会让unmarshall为您完成大部分工作。而不是提供map [string] interface {},你可以提供一个map [string] Monster。
这是一个简单的例子。除了改变解组的工作方式外,我还添加了一个错误返回。错误返回对于查找错误很有用。那个错误返回就是告诉我你有无效的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
答案 1 :(得分:-1)
略微偏向一侧 - 当您需要地图时,您要求提供一系列对象
如果你需要一个数组(实际上是一个切片)
http://ioblocks.blogspot.com/2014/09/loading-arrayslice-of-objects-from-json.html