json格式须知

| Comments

着重介绍与项目使用相关的json知识。如果没有特别说明,环境是指Javascript下的json。

区分类型

  • 首先需要区分json字符串和json对象,不过通常根据上下文可以区分。
  • 协议关注的是json字符串,而代码中处理的是json对象,两者通过序列化(JSON.stringify)和反序列化相互转换(JSON.parse)。

常见格式

  • 主要有数组和key/value形式的object
  • 数组是有顺序的,可以不同类型,常用于顺序遍历操作。
  • object是无顺序的,key只能是字符串,常用于快速随机查找。
  • null是可以被序列化的,而undefined不可以(会消失)。
  • 其他的一些特殊值,如Nan,Infinity,会被序列化为null。

关于数组

  • 对于数组对象,虽然支持key/value的操作,但是序列化的时候设置的值会丢失。
  • 数组序列化的长度是根据length属性来的,没有赋值的位置是null。
  • 对数组遍历不应该采用for in语句,因为通过key/value设置的值也会被输出。

关于Object

  • 规范上规定key是带双引号的字符串(),但实际上很多反序列化工具能够支持数值、单引号字符串、字符串字面量(没有引号的字符串)。
  • 如果是一普通浮点数值,可以通过相应的数值作为key获取,或者通过对应的字符串来获取。如用2.2的话,可以用2.2或”2.2”。
  • 如果是一整型数值,可以用数值,但用字符串只能用整型的,如用2.0的话,可以用2.0或2或”2”,但”2.0”就不可以。
  • 如果使用字符串字面量的话,需要避免一些关键字使用。如delete
  • key不应该重复,如果重复的话,通常结果是后面的会覆盖前面的。
  • 可以用.后面加key来取值,或者用[]这样的操作符来获取,第一种方式更推荐,但只能支持非数字开头的字符串,unicode也是可以。
  • 对object遍历可以采用for in语句。

协议转换

  • 协议传输的是json字符串,但通常里边的类型都是字符串,不区分数值,因此做数值运算需要先转换。
  • 和xml一样,需要注意特殊字符如引号、回车、unicode等,尽量避免手动拼接,采用序列化工具。
  • object类型的json序列化/序列化的时候,都不应该预期他是有顺序的,虽然很多库都有带默认顺序,应该使用数组。

Comments