go - 将具有嵌入式接口(interface)的结构转换为 JSON

标签 go

我有一个要编码为 JSON 的结构。它有一个名为 Foo 的已定义字段(导出为 foo)和一个 data 接口(interface)字段,我想向其传递一个带有附加 JSON 的动态结构字段。

然而,当数据字段是一个接口(interface)而不是特定结构时,它永远不会导出为 JSON。我怎样才能使它工作?

package main

import (
    "encoding/json"
    "fmt"
)

type data interface{}

type foo struct {
    Foo string `json:"foo,omitempty"`
    data
}

type bar struct {
    Bar string `json:"bar,omitempty"`
}

func main() {
    b := bar{"bar"}
    f := foo{"foo", b}

    byt, err := json.Marshal(f)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(byt))
}

我需要输出看起来像这样(它需要是扁平的,而不是嵌套的):

{"foo": "foo", "bar": "bar"}

最佳答案

您可以使用自定义 json.Marshaler 来做到这一点实现和一些字节 slice 。

func (f foo) MarshalJSON() ([]byte, error) {
    type goo foo
    g := goo(f)

    b1, err := json.Marshal(g)
    if err != nil {
        return nil, err
    }

    b2, err := json.Marshal(g.data)
    if err != nil {
        return nil, err
    }

    s1 := string(b1[:len(b1)-1])
    s2 := string(b2[1:])

    return []byte(s1 + ", " + s2), nil
}

https://play.golang.org/p/NYTNWIL-xu

请注意,这不是检查字节是否真的可以 slice ,它也没有考虑 data 字段是 slice 还是数组的可能情况,我不确定如何无论如何,你会希望它变平。

关于go - 将具有嵌入式接口(interface)的结构转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47335352/

相关文章:

go - 未定义(类型 []DataReponse 没有字段或方法)

json - 将 JSON 解码为 Go 接口(interface){}

go - 同一台服务器上的多个 GO 项目

sql - 如何使用 go-mssqldb 修复 Go 中的错误 mssql : Error converting data type decimal to nvarchar.

if-statement - 换行打印执行流程

logging - 戈朗 : How to capture panic and log this error to original log file?

json - 嵌套的Json Array在golang中构造un-marshalling

list - Golang - 链接到 id 的套接字片段以进行通知

Go:如何创建类型为 schema.ResourceData 的实例以进行单元测试?

戈兰 : Custom template "block" functions?