好烦啊,怎么才能在3秒内学会使用FastJson呢

一、FastJson简介

 FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java类转换为JSON字符串,也可以将JSON字符转换为Java类。
 FastJson优点:速度快、使用广泛、测试完备、使用简单、功能完备。(GitHub地址

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>         <!--本文中所有相关代码使用此版本Java包-->
</dependency>

二、Json解析

模板数据:

{
  "status": 0,
  "deploy": true,
  "date": "2019-11-11 10:52:27.811321",
  "message": "complex vehicle json sample",
  "data": {
    "archived": false,
    "creator": "Anchor",
    "time": "2019-11-11 11:30:26",
    "brands": [
      {
        "id": 1205231,
        "type": "LUXURY",
        "name_zh": "奔驰",
        "name_en": "Benz",
        "createDate": "1844-11-25",
        "subsidiary": ["smart", "GLC", "GLA"],
        "popular": [{
          "model": "S350L",
          "color": "White"
        },
          {
            "model": "C260",
            "color": "Silver"
          }]
      },
      {
        "id": 1324561,
        "type": "REALISTIC",
        "name_zh": "长安",
        "name_en": "CHANGAN",
        "createDate": "1996-10-31",
        "subsidiary": ["Passenger", "SUV", "MPV"],
        "popular": [{
          "model": "CS75",
          "color": "Red"
        },
          {
            "model": "XT",
            "color": "Black"
          }]
      }
    ]
  }
}

1.介绍三个类

1)JSON类
  Json转换器(解析器),将Json文本转换成Json对象(JSONObject和JSONArray等)或Java对象,也可将Json、Java对象转换成Json文本。
2)JSONObject类
  由Json文本转换成的Json对象,可从中读取Json文本中的数据。
3)JSONArray类
  由Json文本转换成的Json对象,与JSONObject不同的是JSONArray是个数组。遍历时将JSONArray中的每个元素转换成JSONObject,然后读取数据。

2.简单的读

核心点是,将Json文本转换成JSONObject,然后根据元素名从JSONObject中get数据
常用的get方法,注意getXXX()一般返回引用类型,而对应的getXXXValue()一般返回基本类型,XXX为也可为Short、Float等,下表只是常用的一部分。
    
1)读取单层元素
下例为简单读取sample中的status、message、deploy、date四个元素。

JSONObject jsonObject = JSON.parseObject(sample);      //sample为存储模板数据的String

int status = jsonObject.getIntValue("status");         //getXXXValue()获取到基本类型

String message = jsonObject.getString("message");

Boolean deploy = jsonObject.getBoolean("deploy");      //getXXX()获取到引用类型

Date date = jsonObject.getDate("date");                //可直接取出Date类型的时间

2)读取多层元素
 多层实际上和单层一样,都是从JSONObject中获取数据,先一步一步将要获取的元素的上层转换成JSONObject,然后直接读就可以了。
 例如下例中先将data这个节点转换成JSONObject,再去读取archived、creator、time中的数据。若Json有三层、四层等依次类推即可。

JSONObject jsonObject = JSON.parseObject(sample);         //第一步,将Json转换成JSONObject

JSONObject data = jsonObject.getJSONObject("data");       //第二步,将data元素转换成JSONObject

boolean archived = data.getBooleanValue("archived");      //第三步,取出数据

String creator = data.getString("creator");

Date time = data.getDate("time");

3)读取数组
 先使用getJSONArray()取到待解析的数组,然后遍历该JSONArray,将其中的每个元素转换成JSONObject,然后从JSONObject中读取相应数据。 若此时的JSONObject还是一个数组,继续将其中的元素转换成JSONObject。
 下例展示了如何获取模板数据中所有的subsidiary(数组中嵌套着数组)。

JSONObject jsonObject = JSON.parseObject(sample);                 //第一步,将Json转换成JSONObject

JSONObject data = jsonObject.getJSONObject("data");               //第二步,将data元素转换成JSONObject

JSONArray brands = data.getJSONArray("brands");                   //第三步,将brands转换成JSONArray

List<String> allSubsidiary = new ArrayList<>();
for (int i = 0; i < brands.size(); i++) {                         //遍历brands

    JSONObject brand = brands.getJSONObject(i);                   //将brands数组中每个元素转换成JSONObject
    JSONArray subsidiary = brand.getJSONArray("subsidiary");      //第四步,将subsidiary转换成JSONArray

    for (int j = 0; j < subsidiary.size(); j++) {                 //遍历subsidiary
        String finalData = subsidiary.getString(j);               //第五步,取数据
        allSubsidiary.add(finalData);
    }

}
System.out.println(allSubsidiary);        //运行结果:[smart, GLC, GLA, Passenger, SUV, MPV]

3.解析为Java类

分为两类,一类是将JSONObject转换成Java类,另一类是将JSONArray转换成Java类。
分别调用JSON.parseObject(String text, Class<T> clazz)JSON.parseArray(String text, Class<T> clazz)方法。
下例展示如何将模板数据中的brands元素转换成Java类:

JSONObject jsonObject = JSON.parseObject(sample);
JSONObject data = jsonObject.getJSONObject("data");
JSONArray brands = data.getJSONArray("brands");                             //照例先获取到brands,注意它是JSONArray

List<Brand> brandList = JSON.parseArray(brands.toString(), Brand.class);    //指定解析的String和Class

·Brand类

public class Brand {
    private Integer id;
    private String type;
    private String nameZh;                //支持驼峰命名,也支持下划线命名
    private String name_en;               //nameEn也可解析成功
    private Date createDate;
    private List<String> subsidiary;
    private List<Popular> popular;
}       //get、set方法省略

·Popular类

public class Popular {
    private String model;
    private String color;
}      //get、set方法省略

注意:
  1)若Java类中某个属性无setter方法,则最终无法将json中对应的元素解析为该属性。(例如id无setter方法,最终得到的id为null)
  2)FastJson支持驼峰命名。Json中有个元素名为name_zh,类中属性名为name_zh和nameZh都可解析成功。
·Popular类也可换为Map<String,String>

public class Brand {
    private Integer id;
    private String type;
    private String nameZh;         
    private String name_en;   
    private Date createDate;
    private List<String> subsidiary;
    private List<Map<String,String>> popular;
}       //get、set方法省略

解析结果:

三、Java类转Json

String jsonString = JSON.toJSONString(brandList);

完事!