忽略 JSON Marshal 上不支持的类型错误

xrf*_*ang 3 json go

这是我的代码:

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{}) errorval任何代码,即不是我编写的代码,可以是任何开源代码,甚至是我无法访问其源代码的数据类型。

Teh*_*inX 6

JSON 标签(正确的方式)

这是您要找的:游乐场

您可以使用字段标记来提供有关如何处理结构的 json 说明。另请参阅encoding/json以获取有关您拥有的选项的更多信息。

- 编辑 -

val 的类型无关紧要interface{}json.Marshal()无论如何都会反思它并找出它是什么类型。程序员的工作是在json他/她想要的所有结构上设置正确的标签dump

自定义元帅函数(这里不是必需的另一种方式)

您还可以编写一个自定义 MarshalJSON 函数来根据您的喜好对每种类型进行编组:custom marshalling playground

你自己的 json Marshaller(按照你的方式)

如果你不喜欢 golang 处理 json marshalling 的方式,你总是可以编写自己的 marshalling 函数来完成所有的反射。