Programmer

Will Change The World

golang中json反序列化为struct时key的大小写判别原则

说明:此文章是在go1.11的基础上完成,其他版本的不保证相同

以前一直以为golang在反序列化的时候是tag名和key名严格对应的,结果偶然间发现并不是这样。具体的流程其实是这样:

  •  1. 获取结构体的字段名,暂称为fieldName
    • 1.1 获取tag中的json部分的名称,若为空,进入下一步
    • 1.2 获取结构体字段名
  • 2. 根据fieldName获取比较key和fieldName是否相同的函数equalFold
    • 2.1 如果fieldName包含utf8编码的非ascii码,则equalFold = bytes.EqualFold,否则进入下一步
    • 2.2 如果包含特殊的ascii码”k”、”K”、”s”、”S”,则equalFold = equalFoldRight,否则进入下一步
    • 2.3 如果包含”non-letters”(包括”_”),则equalFold=asciiFoldFold,否则进入下一步
    • 2.4 equalFold=simpleLetterEqualFold
  • 3. 根据2中获取到的函数,比较key和fieldName是否相同,若相同,则将key对应的值赋值给结构体对应的字段。

 

因此可以得出以下结论:

  1. 反序列化的结构体的字段必须是可导出的
  2. 不管json字符串中的key和结构体struct的tag的大小写如何,只要经equalFold函数判断相等即可。
点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注