任意資料解組
很多場景下,需要靈活的對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中文網其他相關文章!