在Go语言中,我如何解密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}
}

这是我正在做的但是失败了:

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

相关文章

kindeditor4.x代码高亮功能默认使用的是prettify插件,prett...
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小