JSON:(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。它基於 ECMAScript(歐洲計算機協會制定的js規範)的一個子集,採用徹底獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成爲理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提高網絡傳輸效率。目前,Json處於數據交換語言的王者地位。javascript
Json的數據自己是數組,中括號包裹。數組的元素之間用「,」
分開,數組元素的數據類型沒有限制。java
//定義數組格式json var jsonArray = ["a1","a2",...]; //打印json數組的a1元素 console.log(jsonArray[0]);
Json的數據自己是對象,大括號去包裹。對象採用鍵值對形式存儲,鍵固定爲字符串類型,值是任意類型的數據,鍵和值使用「:」
分開。spring
//定義對象格式json var jsonObject = {"k1":"v1","k2":"v2"} //打印json對象鍵k1的值 console.log(jsonObject.k1);
數組中的元素是對象編程
var jsonArray = [ {"k1":"v1"},{"k2":"v2"} ]; // 定義數組格式json,數組元素是對象 console.log(jsonArray[0].k1); //訪問數組0索引的元素,該元素的鍵k1對應的值
對象中的值是數組json
var jsonObject = { "k1":["a1","a2"], "k2":["b1","b2"] }; // 定義對象格式json,鍵是字符串類型,值是數組 console.log(jsonObject.k1[0]); //訪問對象的鍵是k1,對於的值爲數組,數組的0索引元素
互相嵌套api
var json = { "k1":[ "a1",{"key1":"value1"},{"key2":"value2"} ], "k2":[ {"key1":"value1"} ] }; //定義對象格式json,鍵是字符串,值是數組,數組的元素是對象 console.log(json.k1[1].key1); //訪問json對象的鍵k1,對應的是數組,訪問數組的1索引,數組的1索引上的元素是對象,訪問key1鍵對應的值
FastJson 是阿里巴巴的開源JSON解析庫,它能夠解析 JSON 格式的字符串,支持將 Java Bean 序列化爲 JSON 字符串,也能夠從 JSON 字符串反序列化到 JavaBean。數組
Fastjson 的優勢spring-mvc
序列化:是指將Java對象轉成json格式字符串的過程。Java Bean對象、List集合對象、Map集合,爲應用最普遍的。服務器
JSON.toJSONString網絡
Java
對象public void objectToJSon(){ Student student = new Student("張三",22,getDate()); String str = JSON.toJSONString(student); System.out.println(str); }
List
集合public void listToJson(){ Student student1 = new Student("張三",22,getDate()); Student student2 = new Student("李四",20,getDate()); List<Student> list = new ArrayList<Student>(); list.add(student1); list.add(student2); String jsonString = JSON.toJSONString(list); System.out.println(jsonString); }
Map
集合public void mapToJson(){ Student student1 = new Student("張三",22,getDate()); Student student2 = new Student("李四",20,getDate()); Map<String,Student> map = new HashMap<String, Student>(); map.put("s1",student1); map.put("s2",student2); String jsonString = JSON.toJSONString(map); System.out.println(jsonString); }
JSON.parseObject
Java
對象public void jsonToObject(){ String jsonString = "{\"age\":20,\"name\":\"張三\",\"birthday\":1617673647826}"; Student student = JSON.parseObject(jsonString, Student.class); System.out.println(student); }
JSON.parseArray
List
集合public void jsonToList(){ String jsonString = "[{\"age\":22,\"birthday\":1617673647826,\"name\":\"張三\"},{\"age\":20,\"birthday\":1617673647826,\"name\":\"李四\"}]"; List<Student> list = JSON.parseArray(jsonString,Student.class); for (int i = 0; i < list.size(); i++) { Student student = list.get(i); System.out.println(student); } }
JSON.parseObject
Map
集合public void jsonToMap(){ String jsonString = "{\"s1\":{\"age\":22,\"birthday\":1617673921907,\"name\":\"張三\"},\"s2\":{\"age\":20,\"birthday\":1617673921907,\"name\":\"李四\"} }"; Map<String,Student> parse = JSON.parseObject(jsonString,new TypeReference<Map<String,Student>>(){}); for(String s : parse.keySet()){ System.out.println(s + ":::"+parse.get(s)); } }
該枚舉支持序列化的一些特性數據定義。
枚舉常量 WriteMapNullValue
序列化爲null
的字段
public void testSerializerFeature(){ Student student = new Student(); student.setAge(20); //student.setName("chen"); student.setBirthday(getDate()); String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue); System.out.println(jsonString); }
枚舉常量 WriteNullStringAsEmpty
字段爲null
,序列化爲""
public void testSerializerFeature(){ Student student = new Student(); student.setAge(20); //student.setName("chen"); student.setBirthday(getDate()); String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullStringAsEmpty); System.out.println(jsonString); }
枚舉常量 WriteNullNumberAsZero
字段爲null
,序列化爲0
public void testSerializerFeature(){ Student student = new Student(); //student.setAge(20); student.setName("chen"); student.setBirthday(getDate()); String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullNumberAsZero); System.out.println(jsonString); }
枚舉常量 WriteNullBooleanAsFalse
字段值爲null
輸出false
枚舉常量 WriteDateUseDateFormat
格式化日期格式
枚舉常量 PrettyFormat
格式化輸出
該註解做用於方法上,字段上和參數上。可在序列化和反序列化時進行特性功能定製
name
序列化後的名字; ordinal
序列化後的順序;format
序列化後的格式;serialize
是否序列化該字段;deserialize
是否反序列化該字段;serialzeFeatures
序列化時的特性定義。該註解做用於類上,對該類的字段進行序列化和反序列化時的特性功能定製
includes
要被序列化的字段; orders
序列化後的順序;serialzeFeatures
序列化時的特性定義。SpringMVC框架中,默認使用的json序列化工具是jackson,咱們須要在SpringMVM的配置文件中,配置消息轉換器,由jackson切換到FastJson。
<!-- FastJson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
<mvc:annotation-driven> <mvc:message-converters register-defaults="false"> <!-- FastJson的消息轉換器--> <bean id = "fastJson" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <!-- FastJsonHttpMessageConverter類屬性賦值--> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
@ResponseBody @RequestMapping("/allBook") public String list() { List<Books> list = bookService.queryAllBook(); String jsonString = JSON.toJSONString(list); //System.out.println(jsonString); return jsonString; }