在decode.go中,它提到:
//将JSON解组为实现Unmarshaler接口的值,
//解组调用该值的UnmarshalJSON方法,包括
//当输入为JSON null时。
//否则,如果值实现encoding.TextUnmarshaler
//并且输入是一个JSON引用的字符串,Unmarshal调用该值
// UnmarshalText方法,带有不带引号的字符串形式。
UnmarshalText
和UnmarshalJSON
之间有什么区别?哪一个更受欢迎?
答案 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)
要将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表示。