当前位置: 首页 > 面试题库 >

如何在Go中将JSON解组到interface {}中?

纪晨
2023-03-14
问题内容

我是Go的新手,现在遇到了问题。我有一个称为Message的类型,它是这样的结构:

type Message struct {
    Cmd string `json:"cmd"`
    Data interface{} `json:"data"`
}

我也有一个名为CreateMessage的类型,如下所示:

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}

我有一个像的JSON字符串{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}}

当我用来json.Unmarshal将其解码为Message变量时,答案是{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}

因此,我可以将JSON解码为Message结构并更改其Data的接口{}以根据Cmd键入CreateMessage吗?

我试图将Data直接转换为CreateMessage类型,但是编译器告诉我Data是map [sting] interface {}类型。


问题答案:

使用json.RawMessage字段为消息的固定部分定义结构类型,以捕获消息的变体部分。为每个变量类型定义结构类型,并根据命令对其进行解码。

type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}

游乐场的例子



 类似资料:
  • 问题内容: 我有以下JSON,我想将其解析为类数组: 这是我想做的但失败的事情: 编译器抱怨v [“ level”] <<无效操作。interface()类型的索引。 问题答案: 此代码中有许多错误。首先,json是无效的json。您缺少顶级对象中密钥对之间的逗号。我添加了逗号并为您漂亮地打印了它: 你的下一个问题(你问的那个)是做一个。这意味着当您在范围循环中对它进行索引时,类型为。您需要使用再

  • 问题内容: 我有一项通过REST为我提供属性的服务。现在,我想将身体解组为属性结构。请查看此操场示例:单击。当我只有一个财产时,可以轻松将其编组为。但是,服务器发出的ACTUAL响应有所不同。我要解组的实际响应是这样的: 不幸的是,我不知道如何解组。有人可以指出正确的方向吗? 问题答案: 您需要解组一片属性:http : //play.golang.org/p/eRgjfBHypH

  • 问题内容: 目前,我目前正在处理一些代码,其中涉及类型为var的 它具有价值,我可以像这样轻松访问: 很好,但是我希望能够使用该 函数,由于它需要type 而不是type ,因此通常会出错。 可以使用该功能的最合适的解决方案是什么,我想也许是某种转换方法? 问题答案: 您需要构造一个新的type数组才能使用: 请参阅相关的Golang常见问题解答条目:我可以将[] T转换为[]接口{}吗?

  • 问题内容: 我想解析一些json数据。数据如下所示: {“ id”:“ someId”,“ key_1”:“ value_1”,“ key_2”:“ value_2”,“ key_3”:“ value_3”,“点数”:[[1487100466412,“ 50.032178”,“ 8.526018”,300 ,0.0,26,0],[1487100471563,“ 50.030869”,“ 8.525

  • 问题内容: 我在Go中使用Sockjs,但是当javascript客户端将json发送到服务器时,它会对其进行转义,并将其作为[]字节发送。我试图弄清楚如何解析json,以便我可以读取数据。但是我得到这个错误。 json:无法将字符串解组为main.Msg类型的Go值 我怎样才能解决这个问题?html.UnescapeString()无效:/ 问题答案: 您可能要先在JSON字符串上使用:) 这是

  • 问题内容: 我有一个这样的结构: 但是,即使MyStruct实例完全为空(意味着所有值都是默认值),它也会被序列化为: 我知道encoding / json文档指定“空”字段为: false,0,任何nil指针或接口值以及任何长度为零的数组,切片,映射或字符串 但不考虑具有所有空/默认值的结构。它的所有字段也都标有,但这无效。 如何获取JSON包以 不 封送我的字段为空结构? 问题答案: 正如文档