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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-28 05:20:30325浏览

How Can I Flatten JSON Structs with Anonymous Members in Go?

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

提供的代码尝试将包含匿名成员的结构转换为具有自定义“的展平 JSON 对象” _links”字段。但是,匿名成员“Anything”被视为命名字段,导致出现不需要的 JSON 结构。

了解 JSON 封送处理中的匿名成员处理

Go 的 JSON 封送器将匿名结构体字段视为其内部导出字段是外部结构体中的字段。可以通过提供带有名称的 JSON 标记来覆盖此行为,但没有明确的机制来展平匿名成员。

使用反射的解决方案

实现所需的效果扁平化,下面的解决方案利用了反射包。通过迭代结构体的字段,我们可以创建一个map[string]interface{},它保留原始对象的结构,而不引入新的字段:

<code class="go">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()
    }
    ...
}</code>

用法示例

以下示例演示了用户和会话结构的扁平化 JSON 输出:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

type User struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
}

type Session struct {
    Id     int `json:"id"`
    UserId int `json:"userId"`
}

func MarshalHateoas(subject interface{}) ([]byte, error) {
    ...  
}

func main() {
    u := &User{123, "James Dean"}
    s := &Session{456, 123}

    json, err := MarshalHateoas(u)
    if err != nil {
        panic(err)
    } else {
        fmt.Println("User JSON:")
        fmt.Println(string(json))
    }

    json, err = MarshalHateoas(s)
    if err != nil {
        panic(err)
    } else {
        fmt.Println("Session JSON:")
        fmt.Println(string(json))
    }
}</code>

JSON 输出:

User JSON:
{
    "id": 123,
    "name": "James Dean",
    "_links": {
        "self": "http://user/123"
    }
}
Session JSON:
{
    "id": 456,
    "userId": 123,
    "_links": {
        "self": "http://session/456"
    }
}

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn