首頁 > 後端開發 > Golang > 如何使用 Go 處理 JSON 序列化和反序列化中的混合類型數組?

如何使用 Go 處理 JSON 序列化和反序列化中的混合類型數組?

Mary-Kate Olsen
發布: 2024-12-10 05:19:13
原創
320 人瀏覽過

How Can I Handle Mixed-Type Arrays in JSON Serialization and Deserialization with Go?

在Go 中自訂混合型別數組的JSON 序列化

在Go 中,原生數組和切片不能包含混合類型的元素。但是,為了適應序列化 JSON 資料需要異質數組的場景,我們可以利用 json.Marshaler 和 json.Unmarshaler 介面來自訂物件的序列化和反序列化方式。

具有混合類型元素的結構:

考慮一個具有以下內容的struct Row fields:

type Row struct {
    Ooid string
    Score float64
    Text  rune
}
登入後複製

雖然我們希望將每個結構體序列化為三個元素的數組,但直接使用結構體將導致輸出轉換為類似字典的結構。

使用 MarshalJSON 自訂序列化:

為了控制序列化過程,我們可以實作Row 類型上的 json.Marshaler 介面。在這裡,我們使用一個interface{}切片作為中介來編碼混合值:

func (r *Row) MarshalJSON() ([]byte, error) {
    arr := []interface{}{r.Ooid, r.Score, r.Text}
    return json.Marshal(arr)
}
登入後複製

使用UnmarshalJSON自訂反序列化:

相反,對於反定義序列化,我們可以在Row 類型上實作json.Unmarshaler 介面。與序列化類似,我們利用一個interface{}切片來儲存反序列化的值,然後將其分配給結構體欄位:

func (r *Row) UnmarshalJSON(bs []byte) error {
    arr := []interface{}{}
    json.Unmarshal(bs, &arr)
    // TODO: handle errors if necessary
    r.Ooid = arr[0].(string)
    r.Score = arr[1].(float64)
    r.Text = arr[2].(string)
    return nil
}
登入後複製

範例:

考慮以下JSON 結構:

[
  ["ooid1", 2.0, "Söme text"],
  ["ooid2", 1.3, "Åther text"]
]
登入後複製

使用我們自訂的序列化和反序列化函數,我們可以將這些JSON 資料轉換為 Row 元素的切片,然後回到原始 JSON 結構,保留異質數組格式。

總而言之,透過自訂序列化和反序列化,我們使 Go 開發人員能夠處理複雜的 JSON 資料結構,包括混合類型的數組,提供靈活性和與不同資料格式的兼容性。

以上是如何使用 Go 處理 JSON 序列化和反序列化中的混合類型數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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