使用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中文網其他相關文章!