如何解决在Go语言中,如何将json解组到对象数组?
此代码中有许多错误。首先,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{}
。您需要使用再次键入assertv.(map[string]interface{})
,然后每次从地图上读取时都键入assert。
我还注意到,mc.Pool[i] = monster
当我是int且mc.Pool是map [string]
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
解决方法
我有以下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”] <<无效操作。interface()类型的索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。