首頁  >  文章  >  後端開發  >  如何根據程式碼值動態解組 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