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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-30 07:07:091039瀏覽

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

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