首页 >后端开发 >Golang >如何在 Go 中序列化和反序列化异构 JSON 数组?

如何在 Go 中序列化和反序列化异构 JSON 数组?

Patricia Arquette
Patricia Arquette原创
2024-12-11 14:57:10463浏览

How to Serialize and Deserialize Heterogeneous JSON Arrays in Go?

在 Go 中序列化异构 JSON 数组

在 Go 中序列化异构 JSON 数组(包含字符串、数字和 unicode 字符的混合)由于该语言禁止混合类型切片,因此提出了挑战。考虑以下所需的 JSON 结构:

{
    results: [
        ["ooid1", 2.0, "Söme text"],
        ["ooid2", 1.3, "Åther text"],
    ]
}

使用 Marshaler 接口进行序列化

要自定义序列化,我们可以为 Row 类型实现 json.Marshaler 接口。我们将使用interface{}的中间切片来编码异构值:

package main

import (
    "encoding/json"
    "fmt"
)

type Row struct {
    Ooid  string
    Score float64
    Text  string
}

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

在此示例中,MarshalJSON 方法将 Row 转换为混合类型的数组。

使用 Unmarshaler 接口进行反序列化

我们可以类似地实现 json.Unmarshaler 接口解构异构值:

func (r *Row) UnmarshalJSON(bs []byte) error {
    arr := []interface{}{}
    json.Unmarshal(bs, &arr)
    r.Ooid = arr[0].(string)
    r.Score = arr[1].(float64)
    r.Text = arr[2].(string)
    return nil
}

此方法将 JSON 字节转换回我们的 Row 结构。

以上是如何在 Go 中序列化和反序列化异构 JSON 数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn