首页 > 后端开发 > Golang > 如何在 Go 中使用嵌入式类型键解组动态 JSON?

如何在 Go 中使用嵌入式类型键解组动态 JSON?

Susan Sarandon
发布: 2024-12-08 01:48:16
原创
541 人浏览过

How to Unmarshal Dynamic JSON with an Embedded Type Key in Go?

使用嵌入式类型键解组动态 JSON

在 Go 中,可以将 JSON 数据解组到具有动态类型字段的结构中具有挑战性的。本文探讨了一种利用自定义结构体和嵌入式类型键来实现此目的的解决方案。

问题陈述

考虑以下 JSON 结构:

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}
登录后复制

我们想要将此 JSON 解组到一个 Go 结构中,该结构具有接口类型 Something 的字段 DynamicField。根据 JSON 中 type 键的值,DynamicField 应对应于 DynamicTypeA 或 DynamicTypeB。

解决方案

为了解决此问题,我们定义以下自定义structs:

type Something interface {
  GetType() string
}

type DynamicType struct {
  Type   string      `json:"type"`
  Value  interface{} `json:"-"` // Not exported
}
登录后复制

DynamicType 表示动态字段,内嵌 Type 键以确定该字段的实际类型 数据。 Value 字段不会导出,以防止直接访问。

接下来,我们定义 Go 结构体来表示 JSON:

type BigStruct struct {
  SomeData     string      `json:"some_data"`
  DynamicField DynamicType `json:"dynamic_field"`
  OtherData    string      `json:"other_data"`
}
登录后复制

最后,我们为 DynamicType 实现 UnmarshalJSON 方法:

func (d *DynamicType) UnmarshalJSON(data []byte) error {
  var typ struct {
    Type string `json:"type"`
  }
  if err := json.Unmarshal(data, &typ); err != nil {
    return err
  }
  switch typ.Type {
  case "A":
    d.Value = new(DynamicTypeA)
  case "B":
    d.Value = new(DynamicTypeB)
  }
  return json.Unmarshal(data, d.Value)
}
登录后复制

此方法解组类型键,然后根据类型创建适当的结构体(DynamicTypeA 或 DynamicTypeB)值。然后,它将剩余的 JSON 数据解组到创建的结构中,然后将其存储在 Value 字段中。

以上是如何在 Go 中使用嵌入式类型键解组动态 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板