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

时间:2013-06-05 04:20:35

标签: go

我有以下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 [“级别”] <<无效的操作。 interface()的索引。

2 个答案:

答案 0 :(得分: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
   }
}

您的下一个问题(您提到的问题)是m := data.(map[string]interface{})使m成为map[string]interface{}。这意味着当您对其进行索引时,例如范围循环中的v,类型为interface{}。您需要使用v.(map[string]interface{})再次键入断言,然后在每次从地图中读取时键入断言。


我还注意到,当我是一个int时你下次尝试mc.Pool[i] = monster而mc.Pool是一个map [string] Monster。 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)
}

我向goplay发布了一个工作示例:http://play.golang.org/p/4EaasS2VLL

答案 1 :(得分:-1)

略微偏向一侧 - 当您需要地图时,您要求提供一系列对象

如果你需要一个数组(实际上是一个切片)

http://ioblocks.blogspot.com/2014/09/loading-arrayslice-of-objects-from-json.html