首页  >  文章  >  后端开发  >  如何根据代码值动态解组 JSON 数据?

如何根据代码值动态解组 JSON 数据?

Linda Hamilton
Linda Hamilton原创
2024-10-31 04:22:02838浏览

How to Unmarshall JSON Data Dynamically Based on a Code Value?

任意数据解组

很多场景下,需要灵活的对 JSON 数据进行解组,让解组过程能够适应不同的情况基于预定代码值的数据结构。这可以动态解释从各种来源接收的数据。

例如,考虑包含“代码”字段的 JSON 消息,该字段指定“有效负载”字段中包含的数据类型。 “payload”字段可以根据“code”值表示不同的数据结构。

为了实现这一点,我们可以使用以下技术:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage // delay parsing until we know the code
}

// Define the possible data structures that can be unmarshalled from the "payload" field
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

// Custom unmarshalling function
func MyUnmarshall(m []byte) {
    var message Message
    var payload interface{}
    json.Unmarshal(m, &message) // delay parsing until we know the color space

    // Determine the data structure based on the "code" field
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }

    // Unmarshall the "payload" field into the appropriate data structure
    json.Unmarshal(message.Payload, payload) //err check ommited for readability

    // Do something with the unmarshalled data
    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>

在此示例中, MyUnmarshall 函数接收 JSON 消息,将“code”和“payload”字段存储在 Message 结构中,然后根据“code”值动态创建数据结构实例。随后,它将“有效负载”字段解组到适当的结构中,并对解组的数据执行所需的操作。

以上是如何根据代码值动态解组 JSON 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn