gpt4 book ai didi

go - 在 Go 语言中,如何将 json 解码为对象数组?

转载 作者:IT老高 更新时间:2023-10-28 13:08:52 26 4
gpt4 key购买 nike

我有以下 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。您缺少顶级对象中 key 对之间的逗号。我添加了逗号并为您漂亮地打印了它:

{
"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 [字符串]接口(interface){}。这意味着当您在范围循环中对它进行索引时,例如 v,类型是 interface{}。您需要使用 v.(map[string]interface{}) 再次键入 assert 它,然后在每次从 map 中读取时键入 assert。


我还注意到,当 i 是 int 而 mc.Pool 是 map[string]Monster 时,您接下来会尝试 mc.Pool[i] = monster。 int 不是该映射的有效键。


您的数据看起来很死板,所以我会让 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

关于go - 在 Go 语言中,如何将 json 解码为对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16931499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com