这是我的代码:
func dump(w io.Writer, val interface{}) error {
je := json.NewEncoder(w)
return je.Encode(val)
}
type example struct {
Name string
Func func()
}
func main() {
a := example{
Name: "Gopher",
Func: func() {},
}
err := dump(os.Stdout, a)
if err != nil {
panic(err)
}
}
Run Code Online (Sandbox Code Playgroud)
该程序将恐慌 json: unsupported type: func()
我的问题是,如何将任何内容编码到 json 中,而忽略那些编码无法处理的内容。比如上面的数据结构,我希望输出是:{"Name": "Gopher"}
重要提示:转储funtion,它的值是一个interface{},也就是不知道是什么样的数据就会收到,所以小把戏,比如json:"-"是不是我想要的。
如果传递给 dump() 的数据不可编组,例如dump(func(){}),只返回空字符串是完全可以接受的。
两年后编辑:
@TehSphinX 提供的答案有一段我想避免的代码:
func (s example) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Name string
}{
Name: s.Name,
})
}
Run Code Online (Sandbox Code Playgroud)
原因是:在func dump(w io.Writer, val interface{}) error,val任何代码,即不是我编写的代码,可以是任何开源代码,甚至是我无法访问其源代码的数据类型。
这是您要找的:游乐场
您可以使用字段标记来提供有关如何处理结构的 json 说明。另请参阅encoding/json以获取有关您拥有的选项的更多信息。
- 编辑 -
val 的类型无关紧要interface{}。json.Marshal()无论如何都会反思它并找出它是什么类型。程序员的工作是在json他/她想要的所有结构上设置正确的标签dump。
您还可以编写一个自定义 MarshalJSON 函数来根据您的喜好对每种类型进行编组:custom marshalling playground
如果你不喜欢 golang 处理 json marshalling 的方式,你总是可以编写自己的 marshalling 函数来完成所有的反射。
| 归档时间: |
|
| 查看次数: |
8731 次 |
| 最近记录: |