在执行 Marshal 和 Unmarshal 时,JSON 字段名称的大小写是否重要?

nih*_*hal -6 go

Marshal 和 Unmarshal 函数是否严格区分大小写?

以下结构定义了票证:

    type TicketInfo struct {
         TicketKey                  string `json:"ticketKey"`       
         Ticketextnum               string `json:"ticketextnum"`        
         TicketDate                 string `json:"ticketDate"`      
         TicketDesc                 string `json:"ticketDesc"`
    }       
Run Code Online (Sandbox Code Playgroud)

此 json 的字符串化形式将作为源系统 API 调用有效负载中的单个参数传递。例如,如果源系统为第一个字段发送“TicketKey”而不是“ticketKey”会发生什么。json.Marshal 会正确接收到 ticketKey 字段吗?

Fli*_*mzy 5

这很容易通过阅读文档或简单的测试来回答。但具体来说,请参阅Marshal 的这些注释(强调):

结构值编码为 JSON 对象。每个导出的结构字段都成为对象的成员,使用字段名称作为对象键,除非由于下面给出的原因之一而省略了该字段。

每个 struct 字段的编码可以通过 struct 字段标签中“json”键下存储的格式字符串进行自定义。格式字符串给出了字段的名称,可能后跟逗号分隔的选项列表。该名称可以为空,以便在不覆盖默认字段名称的情况下指定选项。

解组

要将 JSON 解组为结构,Unmarshal 将传入的对象键与 Marshal 使用的键(结构字段名称或其标签)进行匹配更喜欢精确匹配,但也接受不区分大小写的匹配。默认情况下,不具有相应结构字段的对象键将被忽略(请参阅 Decoder.DisallowUnknownFields 以获取替代方法)。

所以 TL; DR; 对于编组,大小写被精确观察,对于解组,精确大小写是首选,并回退到不区分大小写的匹配。