gpt4 book ai didi

arrays - 在 Go 中序列化混合类型的 JSON 数组

转载 作者:IT王子 更新时间:2023-10-29 01:22:18 24 4
gpt4 key购买 nike

我想返回一个如下所示的结构:

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

这是一个arrags数组,是字符串, float ,unicode字符。

如果是 Python,我将能够:

import json
json.dumps({'results': [["ooid1", 2.0, u"Söme text"], ...])

但在 Go 中,你不能拥有混合类型的数组(或 slice )。

我想过使用这样的结构:

type Row struct {
Ooid string
Score float64
Text rune
}

但我不希望每个都成为字典,我希望它成为一个包含 3 个元素的数组。

最佳答案

我们可以通过实现 json.Marshaler 来自定义对象的序列化方式。界面。对于我们的特定情况,我们似乎有一片 Row 元素,我们希望将其编码为异构值数组。为此,我们可以在 Row 类型上定义一个 MarshalJSON 函数,使用 interface{} 的中间片段对混合值进行编码。

This example演示:

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)
}

func main() {
rows := []Row{
{"ooid1", 2.0, "Söme text"},
{"ooid2", 1.3, "Åther text"},
}
marshalled, _ := json.Marshal(rows)
fmt.Println(string(marshalled))
}

当然,我们也可能想反过来,从 JSON 字节回到结构。所以有一个类似的json.Unmarshaler我们可以使用的界面。

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

这使用了一个类似的技巧,即首先使用 interface{} 的中间片段,使用解码器将值放入这个通用容器中,然后将这些值放回我们的结构中。

package main

import (
"encoding/json"
"fmt"
)

type Row struct {
Ooid string
Score float64
Text string
}

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

func main() {
rows := []Row{}
text := `
[
["ooid4", 3.1415, "pi"],
["ooid5", 2.7182, "euler"]
]
`
json.Unmarshal([]byte(text), &rows)
fmt.Println(rows)
}

您可以阅读完整示例 here .

关于arrays - 在 Go 中序列化混合类型的 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com