英文:
JSON Marshaling producing unexpected results
问题
这是一个演示我的问题的Go Playground链接:http://play.golang.org/p/2fq3Fg7rPg
基本上,我试图对一个包含自定义类型包装json.RawMessage
的结构体进行JSON编组。当使用CustomType.MarshalJSON()
时,我得到了预期的结果,但是只是调用json.Marshal
对我的完整结构体进行编组时,结果并不如预期。请参考Playground链接中的具体示例。
是什么导致了这种差异?
有没有办法让json.Marshal
按照我期望的方式工作?
英文:
Here is a Go Playground demonstrating my problem: http://play.golang.org/p/2fq3Fg7rPg
Essentially, I am trying to JSON marshal a struct containing a custom type wrapping json.RawMessage
. When using CustomType.MarshalJSON()
I get the expected results, but just calling json.Marshal
on my full struct does not work as expected. See the playground link for a concrete example.
What is causing this difference?
Is there a way to have json.Marshal
work as I expect it to?
答案1
得分: 1
你的代码运行得很好,只是有一个小错误。
// MarshalJSON returns the *j as the JSON encoding of j.
func (j JsonText) MarshalJSON() ([]byte, error) {
return j, nil
} // 注意我修改了这里,接收者不是指针
你的代码没有起作用,因为这是你包装 JsonText 数据类型的定义;
// Example struct I want to marshal and unmarshal
type TestData struct {
Field1 JsonText `json:"field_1"`
}
但是只有 `*JsonText` 类型在你的代码中实现了 marshaler 接口。所以你可以在任一位置更改类型(我在 `MarshalJSON()` 中进行了更改),但它们需要保持一致。
在 playground 上查看:http://play.golang.org/p/NI_z3bQx7a
英文:
Your code works fine, you just have one little bug.
// MarshalJSON returns the *j as the JSON encoding of j.
func (j JsonText) MarshalJSON() ([]byte, error) {
return j, nil
} // note i modified this so the receiver isn't a pointer
Your code didn't work because this is your definition of your datatype that wraps JsonText;
// Example struct I want to marshal and unmarshal
type TestData struct {
Field1 JsonText `json:"field_1"`
}
But only the *JsonText
type implements the marshaler interface in your code. So you can change the types in either place ( I did in the MarshalJSON()
) but they need to be consistent.
In the playground; http://play.golang.org/p/NI_z3bQx7a
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论