我有以下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}
}
Run Code Online (Sandbox Code Playgroud)
这是我想要做的但失败了:
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++
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨v ["level"] <<无效操作.interface()类型的索引.
Ste*_*erg 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
}
}
Run Code Online (Sandbox Code Playgroud)
你的下一个问题(一个你问)是m := data.(map[string]interface{})做m一个map[string]interface{}.这意味着当你索引它时,例如v在你的范围循环中,类型是interface{}.您需要再次键入断言v.(map[string]interface{}),然后每次从地图读取时键入断言.
我还注意到你下次尝试mc.Pool[i] = monster我是一个int而mc.Pool是一个地图[string]怪物.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)
}
Run Code Online (Sandbox Code Playgroud)
我向goplay发布了一个工作示例:http://play.golang.org/p/4EaasS2VLL