首頁  >  文章  >  後端開發  >  如何使用動態程式碼驅動模式解組 Go 中的任意 JSON 資料?

如何使用動態程式碼驅動模式解組 Go 中的任意 JSON 資料?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-01 08:22:30748瀏覽

How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

使用JSON 和Go 解組任意資料

您有一個特定的要求:以允許您處理JSON 資料的方式解組JSON數據零件或部分。為了實現這一目標,您需要設想一種結構,其中資料的前半部分(或「代碼」)指示如何解釋後半部分。後半部的兩個潛在結構體是 Range 和 User。

挑戰

Go 中現有的json 套件為編組和解組定義的結構體提供了方便的函數,但是它不能滿足您對任意資料的需求。

解碼解決方案

解決方案涉及在 Message 結構中引入 json.RawMessage 欄位(Payload)。此欄位可讓您延遲解析數據,直到您知道前半部指定的程式碼。

這是Go 中的範例實作:

<code class="go">type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

// Custom unmarshalling function
func MyUnmarshall(m []byte) {
    var message Message
    json.Unmarshal(m, &message)
    var payload interface{}
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
}</code>

用法

您可以透過先使用json.Unmarshal 函數解組「上半部分”來使用此解決方案。然後,根據從“上半部”檢索到的程式碼,您將再次使用 json.Unmarshal 函數解組“下半部”,這次提供目標 json.RawMessage 物件。

範例

<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
MyUnmarshall(json) // This will decode the data into a Range object</code>

注意事項

此技術可讓您以結構化且靈活的方式處理任意資料解組。然而,它引入了運行時依賴,需要預先了解程式碼以及不同程式碼的匹配結構的存在。

以上是如何使用動態程式碼驅動模式解組 Go 中的任意 JSON 資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn