首頁 >後端開發 >Golang >當資料可能是數組或物件時,如何處理 JSON 解組?

當資料可能是數組或物件時,如何處理 JSON 解組?

Susan Sarandon
Susan Sarandon原創
2024-12-13 19:00:13398瀏覽

How to Handle JSON Unmarshalling When the Data Might Be an Array or an Object?

如何使用陣列或物件解組JSON

處理JSON 時,處理回傳資料可能是陣列或物件的場景物件可能具有挑戰性。本文解決了這個問題,並提出了一個解決方案,涉及使用 json.RawMessage 類型和基於 JSON 結構的動態解組。

揭開動態JSON 結構

考慮以下JSON 回應:

{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"

從回應中可以看出,gwrcmd物件或陣列。為了解決這個問題,自訂的Go 結構體定義為:

type Response struct {
    Gwrcmds struct {
        Gwrcmd struct {
            Gcmd  string
            Gdata struct {
                Gip struct {
                    Version string

解組難題

解決這個問題的關鍵在於利用json.RawMessage ,它接受任何JSON 值。我們在Response 結構中建立一個包裝器來保存原始JSON:

type Response struct {
    RawAWrapper struct {
        RawA json.RawMessage `json:"a"`
    }

基於JSON 結構的動態解組

在Response 結構的Unmarshalhal>

func (r *Response) UnmarshalJSON(b []byte) error {
    if err := json.Unmarshal(b, &r.RawAWrapper); err != nil {
        return err
    }
    if r.RawAWrapper.RawA[0] == '[' {
        return json.Unmarshal(r.RawAWrapper.RawA, &r.As)
    }
    return json.Unmarshal(r.RawAWrapper.RawA, &r.A)
}
在Response 結構的Unmarshall 方法中,JSON我們檢查RawAWrapper.RawA 的第一個位元組以確定它是否表示陣列或物件。根據結果,我們相應地解組資料:

這種方法可以靈活地處理具有不同結構的 JSON,而不需要多個結構。

以上是當資料可能是數組或物件時,如何處理 JSON 解組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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