我有一个要编码为 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/