登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-05-02 17:33:12 303浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《在 Go 语言中,如何将 json 解组为对象数组?》,就坚持看下去吧!文中内容包含golang等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我有以下 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"]

正确答案

这段代码有很多错误。首先,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{})使. 这意味着当您索引它时,例如在您的范围循环中,类型是. 您需要再次键入 assert 它,然后在每次从地图中读取时键入 assert。m``map[string]interface{}``v``interface{}``v.(map[string]interface{})


我还注意到,mc.Pool[i] = monster当 i 是 int 并且 mc.Pool 是 map[string]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 语言中,如何将 json 解组为对象数组?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>