着重介绍与项目使用相关的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序列化/序列化的时候,都不应该预期他是有顺序的,虽然很多库都有带默认顺序,应该使用数组。