首頁 > 後端開發 > Golang > 在 Go 中解析 JSON 時如何避免雙重解組?

在 Go 中解析 JSON 時如何避免雙重解組?

Mary-Kate Olsen
發布: 2024-12-30 07:07:09
原創
1022 人瀏覽過

How to Avoid Double Unmarshaling When Parsing JSON in Go?

在Go 中解組JSON,無需雙重解組

在Go 中,可能會遇到需要將JSON 解析為各種結構的情況,但會發生雙重解組,導致冗餘。本文提出了一種解決方案,涉及部分解組資料以避免第二個解組步驟。

理解問題

當嘗試將 JSON 解析為已知結構時,一個常見的問題是方法是:

  1. 將 JSON解組為泛型map[string]interface{}
  2. 找出期望的鍵
  3. 嘗試將值轉換為所需的型別
  4. 如果轉換失敗,將值編組為JSON並將其解組到所需的類型(雙重解組)

解決方案

我們可以將其解組為json.RawMessage,而不是將值強制轉換為interface{}。這會部分解組數據,並允許隨後根據鍵值解組到特定結構。

範例程式碼

import (
    "encoding/json"
    "fmt"
)

type Ping struct {
    Ping string `json:"ping"`
}

type Ack struct {
    Messages []Message `json:"messages"`
}

type Message string

func main() {
    testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`)
    var myAck = Ack{}
    var myMap map[string]json.RawMessage

    err := json.Unmarshal(testJSON, &myMap)
    if err != nil {
        fmt.Println("error unmarshalling: ", err)
    }

    jsonAck, ok := myMap["ack"]
    if !ok {
        fmt.Println("key 'ack' not found")
        return
    }

    err = json.Unmarshal(jsonAck, &myAck)
    if err != nil {
        fmt.Println("unmarshal error", err)
    } else {
        fmt.Println("New ack object: ", myAck)
    }
}
登入後複製

在此修改後的程式碼中,我們取代了映射[string]interface{} 與 map[string]json.RawMessage。處理「ack」鍵時,我們直接解組到 Ack 結構,從而無需雙重解組。

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

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