登录
首页 >  Golang >  Go问答

嵌套结构在自定义解组时,Go语言的结构解组问题

来源:stackoverflow

时间:2024-03-24 19:39:43 370浏览 收藏

在使用 Go 语言的自定义解组器处理嵌套结构时,遇到以下问题: 当嵌套在多个其他结构中且这些结构不需要自定义解组器时,难以使用自定义解组器。在这种情况下,嵌套结构的字段可能无法从 JSON 正确解组。

问题内容

我们需要对嵌套在多个其他结构中的结构使用自定义解组器,而这些结构不需要自定义解组器。我们有很多类似于下面定义的 b 结构的结构(类似于嵌套 a )。代码的输出为 true false 0(预期为 true false 2)。有什么想法吗?

这里有演示示例。

package main

import (
    "fmt"
    "encoding/json"
)

type A struct {
    X bool `json:"x"`
    Y bool `json:"y"`
}

type B struct {
    A
    Z int `json:"z"`
}

func (a *A) UnmarshalJSON(bytes []byte) error {
    var aa struct {
        X string `json:"x"`
        Y string `json:"y"`
    }
    json.Unmarshal(bytes, &aa)

    a.X = aa.X == "123"
    a.Y = aa.Y == "abc"
    return nil
}

const myJSON = `{"x": "123", "y": "fff", "z": 2}`

func main() {
    var b B
    json.Unmarshal([]byte(myJSON), &b)
    fmt.Print(b.X," ",b.Y," ",b.Z)
}

编辑:问题在这里被标记为重复,但是将 a 设为显式字段将使我们的 api 混乱。此外,在将 a 设为显式字段后,结果是 false false 2 所以它根本没有帮助。


解决方案


由于 b 嵌入 a,因此 a.unmarshaljson() 公开为 b.unmarshaljson()。因此, b 实现了 json.unmarshaler ,结果 json.unmarshal() 调用 b.unmarshaljson() ,它仅解组 a 的字段。这就是 b.z 未从 json 设置的原因。

这是我能想到的让它按照不更改 a 中的数据类型的约束工作的最简单方法:

  1. 使 b 嵌入另一个结构体 c,其中包含 a 中未包含的字段。
  2. 为 b 编写一个 unmarshaljson() 方法,将相同的 json 解组到 b.a 和 b.c 中。使用 a 中没有的字段定义另一个类型 c 的优点是您可以将其解组委托给 json 包。

使用新的 b.unmarshaljson() 方法,您现在也可以完全控制对 a 外部的字段进行解组。

type A struct {
    X bool `json:"x"`
    Y bool `json:"y"`
}

func (a *A) UnmarshalJSON(bytes []byte) error {
    // the special unmarshalling logic here
}

type C struct {
    Z int `json:"z"`
}

type B struct {
    A
    C
}

func (b *B) UnmarshalJSON(bytes []byte) error {
    if err := json.Unmarshal(bytes, &b.A); err != nil {
        return err
    }
    if err := json.Unmarshal(bytes, &b.C); err != nil {
        return err
    }
    return nil
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《嵌套结构在自定义解组时,Go语言的结构解组问题》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>