首页 > 后端开发 > Golang > 如何在 Go 中使用匿名成员展平编组 JSON 结构?

如何在 Go 中使用匿名成员展平编组 JSON 结构?

Barbara Streisand
发布: 2024-10-29 07:35:31
原创
222 人浏览过

How to Flatten Marshaled JSON Structs with Anonymous Members in Go?

在 Go 中使用匿名成员扁平化编组 JSON 结构

在 Go 中编组 JSON 数据时,匿名成员可能会带来意想不到的复杂性。本文深入研究了解决这些挑战的解决方案。

问题

考虑以下代码:

<code class="go">type Hateoas struct {
    Anything
    Links map[string]string `json:"_links"`
}</code>
登录后复制

当 Hateoas 包含匿名成员时,JSON 封送拆收器会处理它们作为常规命名字段,导致不需要的嵌套:

<code class="json">{
    "Anything": {
        "id": 123,
        "name": "James Dean"
    },
    "_links": {
        "self": "http://user/123"
    }
}</code>
登录后复制

解决方案:基于反射的扁平化

为了扁平化 JSON 结构并消除额外的嵌套,我们可以利用反射:

<code class="go">subjectValue := reflect.Indirect(reflect.ValueOf(subject))
subjectType := subjectValue.Type()
for i := 0; i < subjectType.NumField(); i++ {
    field := subjectType.Field(i)
    name := subjectType.Field(i).Name
    out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface()
}</code>
登录后复制

此循环迭代结构体的字段,提取它们的 JSON 标签名称,并将它们映射到扁平化的 map[string]interface{}。通过使用反射,我们避免添加新的命名字段并保留原始的平面结构。

示例

以下是如何使用此解决方案的示例:

<code class="go">import "reflect"

func MarshalHateoas(subject interface{}) ([]byte, error) {
    links := make(map[string]string)
    out := make(map[string]interface{})
    subjectValue := reflect.Indirect(reflect.ValueOf(subject))
    subjectType := subjectValue.Type()
    for i := 0; i < subjectType.NumField(); i++ {
        field := subjectType.Field(i)
        name := subjectType.Field(i).Name
        out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface()
    }
    switch s := subject.(type) {
    case *User:
        links["self"] = fmt.Sprintf("http://user/%d", s.Id)
    case *Session:
        links["self"] = fmt.Sprintf("http://session/%d", s.Id)
    }
    out["_links"] = links
    return json.MarshalIndent(out, "", "    ")
}</code>
登录后复制

与通过这个改进的 MarshalHateoas 函数,示例 JSON 输出变为:

<code class="json">{
    "id": 123,
    "name": "James Dean",
    "_links": {
        "self": "http://user/123"
    }
}</code>
登录后复制

结论

通过利用反射,我们可以有效地展平具有匿名成员的 JSON 结构,并在不影响数据完整性的情况下实现所需的 JSON 结构。该解决方案提供了一种强大的方法来处理 Go 中复杂的 JSON 序列化场景。

以上是如何在 Go 中使用匿名成员展平编组 JSON 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

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