gpt4 book ai didi

serialization - io.Reader 无法序列化的 Golang 结构

转载 作者:IT王子 更新时间:2023-10-29 02:27:36 26 4
gpt4 key购买 nike

我正在尝试将下面的结构序列化为 byte[] 以将其存储到 DB 中,然后在从 DB 读取它时反序列化它。

type Response struct {
Headers map[string][]string
Body io.Reader
Status int
}

下面是我如何创建响应对象并为其设置值的代码。

resp := new(Response)
resp.Body = bytes.NewReader(outBytes) //outBytes is byte[]
resp.Headers.SetKeyValue("Content-Type", "text/json") //SetKeyValue is the method created for adding headers
resp.Headers.SetKeyValue("Url-Type", "broker")
resp.Status = 200

我正在使用 json.Marshal() 来序列化 resp 对象,如下所示。

b, _ := json.Marshal(resp)

下面是我用来反序列化的代码。

var r Response
r.Body = &bytes.Buffer{}
json.Unmarshal(b,&r)

问题在于反序列化,我无法获取 resp.Body 对象。尽管设置了正文对象(见上文),它始终为 nil 或空白。我能够从反序列化中获取结构的 HeadersStatus 字段,但不能获取 Body

我知道 Body 字段需要处理一些事情,它是一个 io.Reader

任何帮助都会很棒。

最佳答案

简答:JSON 编码器不会使用 Read() 函数从 io.Reader 读取字符串。您可以使用实现 Marshaler 接口(interface)的类型,而不是使用 io.Reader

Marshaller 的工作原理:Marshal递归遍历值v。如果遇到的值实现了 Marshaler 接口(interface)并且不是 nil 指针,Marshal 将调用其 MarshalJSON 方法来生成 JSON。如果不存在 MarshalJSON 方法但该值实现了 encoding.TextMarshaler,Marshal 将调用其 MarshalText 方法。 nil 指针异常不是严格必要的,而是模仿 UnmarshalJSON 行为中类似的必要异常。

否则,Marshal 使用以下依赖于类型的默认编码:

  • bool 值编码为 JSON bool 值。
  • float 、整数和数值编码为 JSON 数字。

实现这是你可以做的

type Response struct {
Headers map[string][]string
Body *JSONReader
Status int
}

type JSONReader struct {
*bytes.Reader
}

func NewJSONReader(outBytes []byte) *JSONReader {
jr := new(JSONReader)
jr.Reader = bytes.NewReader(outBytes)
return jr
}

func (js JSONReader) MarshalJSON() ([]byte, error) {
data, err := ioutil.ReadAll(js.Reader)
if err != nil {
return nil, err
}
data = []byte(`"` + string(data) + `"`)
return data, nil
}

// UnmarshalJSON sets *jr to a copy of data.
func (jr *JSONReader) UnmarshalJSON(data []byte) error {
if jr == nil {
return errors.New("json.JSONReader: UnmarshalJSON on nil pointer")
}
if data == nil {
return nil
}
data = []byte(strings.Trim(string(data), "\""))
jr.Reader = bytes.NewReader(data)
return nil
}

这是一个带有实现和示例使用的 go playground 链接:link

关于serialization - io.Reader 无法序列化的 Golang 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41393573/

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