首页 > 后端开发 > Golang > 如何根据'代码”解组具有不同结构的任意 JSON 数据?

如何根据'代码”解组具有不同结构的任意 JSON 数据?

Linda Hamilton
发布: 2024-10-30 10:21:03
原创
611 人浏览过

How to Unmarshal Arbitrary JSON Data with Varying Structures Based on a

解编任意 JSON 数据

问题:

JSON 数据可以通过某种方式编组吗这允许它被分解为部分或部分?在这种情况下,数据的上半部分定义了一个“代码”,指示下半部分的数据类型,该代码在结构之间可能有所不同。在 Go 中如何实现这一点?

答案:

要解组任意 JSON 数据,其中下半部分可能因结构体而异,您可以延迟解析下半部分,直到上半部分的“code”是已知的。

实现:

  1. 定义一个带有 int Code 字段和 json.RawMessage Payload 字段的 Message 结构。该字段将临时存储未解析的下半部分。
  2. 创建函数来根据代码解析和解组不同的结构类型。
  3. 从 JSON 数据解组 Message 结构。这将解析数据的上半部分并延迟解析下半部分。
  4. 根据代码,创建适当结构类型的实例并将 Payload 解组到其中。

示例代码:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

func MyUnmarshall(m []byte) {
    var message Message
    var payload interface{}
    json.Unmarshal(m, &message)
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
    fmt.Printf("\n%v%+v", message.Code, payload)
}

func main() {
    json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
    MyUnmarshall(json)
    json = []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
    MyUnmarshall(json)
}</code>
登录后复制

以上是如何根据'代码”解组具有不同结构的任意 JSON 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板