Golang中UnmarshalText和UnmarshalJson之间的区别是什么?

时间:2017-10-03 21:30:01

标签: json go

decode.go中,它提到:

  

//将JSON解组为实现Unmarshaler接口的值,

     

//解组调用该值的UnmarshalJSON方法,包括

     

//当输入为JSON null时。

     

//否则,如果值实现encoding.TextUnmarshaler

     

//并且输入是一个JSON引用的字符串,Unmarshal调用该值

     

// UnmarshalText方法,带有不带引号的字符串形式。

UnmarshalTextUnmarshalJSON之间有什么区别?哪一个更受欢迎?

2 个答案:

答案 0 :(得分:2)

简单地:

  • UnmarshalText解组文本编码值。
  • UnmarshalJSON解组JSON编码的值。

哪个更受欢迎取决于你正在做什么。

JSON编码由RFC 7159定义。如果您正在使用或生成JSON文档,则应使用JSON编码。

文本编码没有标准,完全依赖于实现。 Go为几种类型实现Text-(un)编组程序,但不能保证任何其他应用程序都能理解这些格式。

文本编码最常用于URL查询参数,HTML表单或其他松散定义的格式。

如果你有选择,使用JSON可能是一个更好的方法。但同样,这取决于你正在做什么才是最有意义的。

由于它与Go的JSON解组器相关,如果已定义,JSON解组将调用类型的UnmarshalJSON方法,如果已定义,则返回UnmarshalText

如果您知道自己将使用JSON,则应该绝对定义UnmarshalJSON函数。

如果您希望在非JSON上下文中使用它,通常会创建UnmarshalText,并且JSON解组器也会使用它,而不必复制它(如果确实相同的话)实现适用于JSON)。

答案 1 :(得分:0)

Per the documentation

  

要将JSON解组为实现Unmarshaler接口的值,   Unmarshal调用值的UnmarshalJSON方法,包括何时   输入是JSON null。否则,如果值实现   encoding.TextUnmarshaler和输入是一个JSON引用的字符串,   Unmarshal使用unquoted调用值的UnmarshalText方法   字符串的形式。

含义:如果你想要一些JSON并用一些自定义逻辑解组它,你可以使用UnmarshalJSON。如果你想在JSON文档的字符串字段中获取文本并以某种特殊方式对其进行解码(即解析它而不是将其写入string - 类型字段),则可以使用{{1} }。例如,UnmarshalText实现net.IP,以便您可以提供类似UnmarshalText的字符串值,并将其解组为"ipAddress": "1.2.3.4"字段。如果net.IP未实现net.IP,则只能解组基础类型(UnmarshalText)的JSON表示。