任意数据解组
很多场景下,需要灵活的对 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中文网其他相关文章!