首頁 > 後端開發 > Golang > 如何在 Go 中解析 JSON 而無需雙重解組?

如何在 Go 中解析 JSON 而無需雙重解組?

Susan Sarandon
發布: 2024-12-26 15:58:14
原創
1002 人瀏覽過

How to Parse JSON in Go Without Double Unmarshaling?

Go 中不使用Double Unmarshaling 解析JSON

在Go 中,你可能會遇到這樣的情況:你想在不使用Double Unmarshaling 的情況下解析不同類型的JSON 資料解組兩次。讓我們探討一下所涉及的步驟:

第1 步:解組為通用映射

正如您所提到的,第一步是將JSON 解組為通用映射[string ]介面{}。這提供了類似地圖的結構,其中鍵是字串,值是可以保存各種資料結構的動態介面類型。

第 2 步:識別鍵和值類型

獲得映射後,迭代它以查找您感興趣的鍵。根據值類型,您可以繼續下一步步驟。

第3 步:直接處理已知類型

如果值類型是已知結構,則可以直接對其進行轉換並將其用作所需的結構。例如,如果您有一個 Ping 結構,則可以檢查映射值是否可轉換為 Ping。如果 JSON 欄位名稱與結構欄位名稱相符且資料類型相容,則此方法效果很好。

第4 步:未知類型的替代方法

如果值類型未知或與您的預定義結構不相容,您可以採用以下方法:

  1. Marshal使用json.Marshal 將介面{}中的值傳回JSON。
  2. 使用 json.Unmarshal 將 JSON 解組到所需的結構中。

改進的部分解組

為了避免雙重解組的需要,您可以部分地透過將值解組到json.RawMessage 而不是interface {} 來解組資料。 json.RawMessage 表示原始 JSON 值,稍後可以直接解組到所需的結構中。

程式碼範例

在您提供的範例中,您可以修改程式碼如下:

var myMap map[string]json.RawMessage

...

switch k {
    case "ping":
        // ...
    case "ack":
        err = json.Unmarshal(v, &myAck)
}
登入後複製

這種方法避免了當值類型時需要第二個解組步驟是已知的。但是,您仍然需要編寫 switch 語句來處理不同的情況。

以上是如何在 Go 中解析 JSON 而無需雙重解組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板