首頁 > 後端開發 > Golang > 主體

如何根據「程式碼」解組具有不同結構的任意 JSON 資料?

Linda Hamilton
發布: 2024-10-30 10:21:03
原創
549 人瀏覽過

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

解編任意JSON 資料

問題:

問題:

JSON 資料可以透過某種方式JSON編組嗎這允許它被分解為部分或部分?在這種情況下,資料的上半部定義了一個“代碼”,指示下半部的資料類型,該程式碼在結構之間可能有所不同。在 Go 中如何實現這一點?

答案:

要解組任意JSON 數據,其中下半部分可能因結構體而異,您可以延遲解析下半部分,直到上半部分的“code”是已知的。

  1. 實作:
  2. 定義一個帶有 int Code 欄位和 json.RawMessage Payload 欄位的 Message 結構。此欄位將暫時儲存未解析的下半部。
  3. 建立函數來根據程式碼解析和解組的不同結構類型。
從 JSON 資料解組 Message 結構。這將解析資料的上半部並延遲解析下半部。

根據程式碼,建立適當結構類型的實例並將 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!