JSON

介绍

JavaScript Object Notation(JavaScript对象表示法)是目前最常用的对象序列化的方式。JSON可以在任何语言中使用,因为json官方指定了一套标准,各种语言都支持这套标准。

基本格式

必须是 对象 **{}**数组 **[]**

语法规则

  • 数据用键值对表示(键:值)键必须是字符串,值的类型见下
  • 多条数据之间用逗号分隔
  • 符号都是半角

    JSON值的类型

  • 数字(整数或浮点数)

  • 字符串(在双引号中)
  • 逻辑值(true或false)
  • 数组(在中括号中)
  • 对象(在大括号中)

    例子

    1. {
    2. "name": "韦小宝",
    3. "age": 26,
    4. "height": 182.4,
    5. "birthday": "1670-7-28",
    6. "isRich": true,
    7. "wifes": ["阿珂", "双儿", "建宁公主", "苏荃", "沐剑屏", "曾柔", "方怡"],
    8. "firstMaster": {
    9. "name": "陈近南",
    10. "birthday": "1634-12-1"
    11. }
    12. }

    FastJSON

    在Java中操作JSON就使用FastJSON。FastJSON是一个标准的JSON库。

    添加依赖

    避免带有 alpha beta 标记的版本,这是测试版本不稳定。
    1. <!-- 在下列地址查询最新的版本:https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    2. <dependency>
    3. <groupId>com.alibaba</groupId>
    4. <artifactId>fastjson</artifactId>
    5. <version>1.2.62</version>
    6. </dependency>

    序列化对象

    序列化就是将对象转换为JSON格式字符串的过程。 ```java import com.alibaba.fastjson.JSON;

//实现对象的序列化 public static void main(String[] args) { Building b = new Building(); b.setName(“创业大厦”); b.setAddress(“天宁兰陵兰陵路26号 “); //调用JSON.toJSONString(b),把Building对象转换为JSON格式的字符串返回 String content = JSON.toJSONString(b); System.out.println(content); }

  1. <a name="2puPP"></a>
  2. #### 反序列化对象
  3. 反序列化就是将JSON格式的字符串还原为对象的过程。
  4. ```java
  5. public static void main(String[] args) {
  6. Building b = new Building();
  7. b.setName("创业大厦");
  8. b.setAddress("天宁兰陵兰陵路26号 ");
  9. //序列化对象
  10. String content = JSON.toJSONString(b);
  11. //转换为一个具体对象,第一个参数是字符串内容,第二个参数是目标类
  12. Building b2 = JSON.parseObject(content,Building.class);
  13. String name = b2.getName();
  14. System.out.println(name);
  15. //特殊情况下,java系统里没有具体对象的 class ,可以反序列化为 Map,将Map.class作为目标类
  16. Map info = JSON.parseObject(content,Map.class);
  17. String name2 = (String)info.get("name");
  18. System.out.println(name2);
  19. //当JSON格式是[],表示数组时,反序列化为List
  20. List<String> dataList = JSON.parseObject(content, List.class);
  21. }

解释一下反序列化为Map:

  • Java的特点面向接口编程,这就意味着不用关心具体是哪种Map(HashMap,TreeMap等)
  • 解耦

解释一下反序列化为List,list反序列化的结果取决于原始字符串的格式

  • 如果集合中包含的是字符串(字符串也是对象)

    1. //["a","b","c"]
    2. List<String> data = JSON.parseObject(content,List.class);
  • 如果集合中包含的是对象

    1. //[{"a1":"1"},{"a2","2"}]
    2. List<Map> data = JSON.parseObject(content,List.class);
  • 如果集合中包含集合

    1. //[["a","b","c"]]
    2. List<List> data = JSON.parseObject(content,List.class);