JSON是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成,是开发中特别常用的数据格式,那JSON的key为什么要用引号?下面来我们就来给大家讲解一下。
根据官方定义可以看出,键值对pair一定是string : value的格式。
key:必须是string,根据string的定义,所以必须打双引号。
value:可以是string,number,object,array,true,false,null这些东西里面只有string是带双引号的,其他都不带。
至于为什么这么定义?从使用上说,你如果把其他类型做为key,在做解析的时候肯定会带来不便。
从逻辑上说,key的作用就是为value取一个特定的名称,名称当然是用字符串来表示。
JSON的key能是数字吗?
json是javascript的子集,在javascript中,只能使用字符串作为对象的key,看一下示例:
let a = {1: 1, true: true}; console.log(a[1]); // 1 console.log(a["1"]); // 1 console.log(Object.keys(a)); // ["1", "true"] console.log(JSON.stringify(a)); // "{"1":1,"true":true}"
第4行代码能够直接说明对象的key被转换为了字符串,而第5行转化为json中,key也都被转化为字符串。
json是跨语言的,我们来看下Java版本:
public class JsonTest { public static void main(String[] args) { Mapmap = new HashMap < > (); map.put(1, "a"); map.put(2, "b"); map.put(true, "c"); String json = JSON.toJSONString(map); System.out.println(json); // {1:"a",2:"b",true:"c"} // 使用fastjson JSONObject jsonObject1 = JSONObject.parseObject(json); System.out.println(jsonObject1.keySet()); // [1, 2, true], keySet的类型是String System.out.println(jsonObject1.get(1)); // "a" System.out.println(jsonObject1.get("1")); // null // 官方json org.json.JSONObject jsonObject2 = new org.json.JSONObject(json); System.out.println(jsonObject2.keySet()); // [1, 2, true], keySet的类型是String System.out.println(jsonObject2.get("1")); // "a" System.out.println(jsonObject2.get(1)); // 编译错误,get方法中的key只能是String } }
使用fastjson和官方的json库分别对json进行了实验:
序列化
官方的json和fastjson在构建json时,添加元素时,key都只能是字符串,上述demo中使用了map获取到key为数值的 “json结构”。
反序列化
demo中可以看出,fastjson的提供了获取非字符串key的get方法,官方json库只能获取字符串key,其中jsonObject2中的key已经被转换为字符串,参见下图:
从文章中我们可以看出,标准的Json结构的key必须是string类型的,在使用一些第三方的库时,对key时其他类型的支持程度并不相同,建议后续使用json时,key的类型设定为string类型,减少多系统协作时的问题。
key必须是string,根据string的定义,所以必须打双引号,这也是JSON的key要用双引号的原因哦!最后大家如果想要了解更多json工具教程知识,敬请关注奇Q工具网。
推荐阅读: