JSON 使用总结
JSON 使用总结
JSON :JavaScript Object Notation (JavaScript 对象表示法),JSON 语法是 JavaScript 语法的子集,但是 JSON 独立于语言和平台。
JSON 是轻量级的文本数据交换格式,格式简单,层级清晰,可读性强,可被 JS 直接解析,数据可使用 AJAX 传输,便于前后端交互
JSON 语法格式:
JSON 的数据包括数字、字符串、数组、对象,数字不需要符号包裹,字符串用 "" 双引号包裹,数组用 [] 方括号包裹,对象用 {} 花括号包裹(JSON 中所有符号均为英文)
数据使用键/值对表示:键,必须是字符串,且同一个对象中的键不能重复;值可以是数字、字符串、数组、对象,可重复;键和值之间 用 : 冒号分隔
数据由 , 逗号分隔,即同一级的数据由逗号分隔
JSON 与 Java 互转
Java 中的对象可解析成 JSON 格式,同样 JSON 格式也可以解析成 Java 对象。
Java 与 JSON 互转的方法比较简单,网上也很容易找到,本文不做赘述,本文也不做原理上的分析,想学习原理可参考Json字符串和java对象之间的相互转换(原理篇)
本文主要做使用过程中经验上的总结
-
一般 JSON 中的对象(花括号包裹的部分)会转化成 Java 中的 Map<String,Object> 容器,即 JSON 对象中的键对应 Map 中的 K,K是字符串类型的, JSON 对象中的值对应 Map 中的 V,V 可以是数字、字符串、对象或集合类型(包括数组)
-
JSON 中的数组(方括号包裹的部分)会转化成 Java 中的集合类型(包括数组),即 JSON 数组中的一条数据对应 Java 集合中的一个元素,因此 Java 集合的元素类型要包含 JSON 数组的数据类型。
例1:有一个 JSON 数组如下 [1,2,3,4,5] 转成 Java 集合,可使用 List<Integer> 例2:有一个 JSON 数组如下 [1,"a",{"b":"c"}] 转成 Java 集合,可使用 List<Object> ,集合中的元素类型只能为 Object
-
Java 转 JSON 时,Java 中的 Class 会转化成 JSON 中的对象,集合类型(包括数组)会转化成 JSON 中的数组,Map<K,V> 容器会转化成 JSON 中的对象,其中 K 如果不是字符串类型则会被强制转成字符串类型。
例:
public static void main(String[] args) { Map<String,Object> map1 = new HashMap<>(); Map<Map<String,Object>,String> map2 = new HashMap<>(); map1.put("a", 1); map2.put(map1, "abc"); String json1 = JsonKit.toJson(map1); String json2 = JsonKit.toJson(map2); System.out.println(json1); System.out.println(json2); } 输出结果如下: {"a":1} {"{a=1}":"abc"} 以上代码可见,map2 中的 K 不是 String 类型,转为 JSON 格式后被强转成了 String 类型。
-
Java 中的数据有的是有序有的是不定序的,转成 JSON 格式后,顺序则会固定下来,即 JSON 中的数据是有顺序的。
-
*此处注意一点,有的浏览器在显示 JSON 格式数据时会自动排序,这样会造成显示顺序与 JSON 数据实际顺序不一样。但 JS 读取 JSON 数据时与其他数据交互时依然是 JSON 数据原本的顺序。即即使发现浏览器显示顺序与 JSON 数据顺序不符,但不影响数据交互。
经百度,Chrome 显示 JSON 时会自动排序,FireFox 显示 JSON 时按数据本身的顺序。
JSON文件
JSON 格式的文件以 .json 为后缀, .json 文件可使用记事本、浏览器、文件编辑器( notepad )打开,可以使用 .json、 .txt 文件作为 JSON 数据的载体进行读取和传输。但 .json 文件中的内容并不一定是标准的 JSON 格式数据,因此不建议使用 .json 文件进行 JSON 数据的交互。