JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。 它基于JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java,JavaScript,Perl,Python等)。 这些特性使JSON成为理想的数据交换语言。
Json是开发中特别常用的数据格式,大家应该对它非常的熟悉了,现在有个问题:
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) {
Map<Object, String> map = 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类型,减少多系统协作时的问题。
如有任何知识产权、版权问题或理论错误,还请指正。
转载请注明原作者及以上信息。