首页 > 后端开发 > Golang > 如何在 Go 中向未知结构的 JSON 输出添加任意字段?

如何在 Go 中向未知结构的 JSON 输出添加任意字段?

Linda Hamilton
发布: 2024-12-29 17:47:10
原创
431 人浏览过

How to Add Arbitrary Fields to the JSON Output of an Unknown Struct in Go?

向未知结构体的 JSON 输出添加任意字段

简介

将结构体嵌入为匿名闭包是将额外字段添加到 JSON 的常见方法输出。然而,这种技术仅限于结构类型已知的情况。

问题:嵌入未知类型

在处理任意结构或接口时,传统的嵌入方法会失败。考虑以下代码:

type example interface{}
type Data struct {
    Name string
}

type Extra struct {
    Text string
}

func printInterface(val interface{})    {
    example1 := struct {
        example
        Extra string
    }{
        example: val,
        Extra: "text",
    }
    json.NewEncoder(os.Stdout).Encode(example1)
}

func main() {
    d := Data{Name:"name"}
    printInterface(&d)
}
登录后复制

此代码生成以下 JSON 输出:

{"example":{"Name":"name"},"Extra":"text"}
登录后复制

如您所见,数据结构的 Name 字段不包含在 JSON 输出中。这是因为接口没有字段,因此底层结构体的字段不会被提升。

动态生成结构体类型

一种解决方案是使用反射动态生成新的结构体类型。此结构将包含未知类型的匿名字段和用于额外数据的附加字段。

func printInterface(val interface{}) {
    t2 := reflect.StructOf([]reflect.StructField{
        reflect.StructField{
            Name:      "X",
            Anonymous: true,
            Type:      reflect.TypeOf(val),
        },
        reflect.StructField{
            Name: "Extra",
            Type: reflect.TypeOf(""),
        },
    })

    v2 := reflect.New(t2).Elem()
    v2.Field(0).Set(reflect.ValueOf(val))
    v2.FieldByName("Extra").SetString("text")

    json.NewEncoder(os.Stdout).Encode(v2.Interface())
}
登录后复制

此代码生成所需的 JSON 输出:

{"Name":"name","Extra":"text"}
登录后复制

编组两次

另一种选择是编组未知值,将其解组到映射中,添加额外的字段,然后将映射重新编组到JSON.

func printInterface(val interface{}) error {
    data, err := json.Marshal(val)
    if err != nil {
        return err
    }

    v2 := map[string]interface{}{}
    if err := json.Unmarshal(data, &v2); err != nil {
        return err
    }

    v2["Extra"] = "text"
    return json.NewEncoder(os.Stdout).Encode(v2)
}
登录后复制

此解决方案更简单,但由于双重编组过程,效率可能较低。

以上是如何在 Go 中向未知结构的 JSON 输出添加任意字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

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