dongposhi8677 2013-06-05 04:20
浏览 58
已采纳

在Go语言中,如何将json解组到对象数组?

I have the following JSON, and I want to parse it into array of class:

{
    "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}
}

Here is what i am trying to do but failed:

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++
    }

}

The compiler complain about the v["level"] << invalid operation. index of type interface().

  • 写回答

2条回答 默认 最新

  • douji9734 2013-06-05 04:58
    关注

    This code has many errors in it. To start with, the json isn't valid json. You are missing the commas in between key pairs in your top level object. I added the commas and pretty printed it for you:

    {
       "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
       }
    }
    

    Your next problem (the one you asked about) is that m := data.(map[string]interface{}) makes m a map[string]interface{}. That means when you index it such as the v in your range loop, the type is interface{}. You need to type assert it again with v.(map[string]interface{}) and then type assert each time you read from the map.


    I also notice that you next attempt mc.Pool[i] = monster when i is an int and mc.Pool is a map[string]Monster. An int is not a valid key for that map.


    Your data looks very rigid so I would make unmarshall do most of the work for you. Instead of providing it a map[string]interface{}, you can provide it a map[string]Monster.

    Here is a quick example. As well as changing how the unmarshalling works, I also added an error return. The error return is useful for finding bugs. That error return is what told me you had invalid 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)
    }
    

    I posted a working example to goplay: http://play.golang.org/p/4EaasS2VLL

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法