Json中的key类型

Posted by Codeboy on March 7, 2020

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类型,减少多系统协作时的问题。

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。