JSON编组产生意外结果

huangapple go评论85阅读模式
英文:

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

huangapple
  • 本文由 发表于 2015年7月16日 01:59:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/31437749.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定