FastJson使用说明
1. FastJson 简介
FastJson 是一个java库,可以将java对象转化成JSON格式,同时也可以将JSON字符串解析成java对象,除此之外还支持 Map、list 转JSON等操作
2. 下载
方式一:直接去mavan中央仓库下载jar包,然后导入项目中
地址:https://github.com/alibaba/fastjson/tree/1.2.75
方式二:配置mavan依赖 https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.75
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
3. 序列化
序列化就是将其他类型转化成json格式
主要代码:
String objJson = JSON.toJSONString(Object object);
1. Map 转 JSON
HashMap<String, String> map = new HashMap<>();
map.put("id","340826");
map.put("phone","15279146568");
String str = JSON.toJSONString(map);
2. List 转 JSON
List<Map<String,String>> list=new LinkedList<>();
HashMap<String, String> map = new HashMap<>();
map.put("id","340826");
map.put("phone","15279146568");
HashMap<String, String> map2 = new HashMap<>();
map2.put("name","xiaoming");
map2.put("sex","male");
list.add(map);
list.add(map2);
String str = JSON.toJSONString(list);
System.out.println(str);
3. java bean 转 JSON
student 实体类:
package com.zjjg.domain;
import java.util.List;
import java.util.Map;
/**
* @author xiaoming
* @version 1.0
* @date 2021/3/26 13:44
*/
public class Student {
private int id;
private String name;
private int age;
private List<String> hobby;
// Dog 也是一个实体类
private List<Dog> dogs;
private Map<String,String> cards;
// get,set,有参无参构造方法,tostring方法
}
Dog实体类
public class Dog {
private String name;
private int age;
// get,set,有参无参构造方法,tostring方法
}
Dog ww = new Dog("ww", 3);
Dog wc = new Dog("wc", 4);
ArrayList<Dog> dogArrayList = new ArrayList<>();
dogArrayList.add(ww);
dogArrayList.add(wc);
HashMap<String, String> map = new HashMap<>();
map.put("id","340826");
map.put("phone","15279146568");
List<String> hobby=new LinkedList<>();
hobby.add("LOL");
hobby.add("cf");
Student xm = new Student(1, "xm", 16, hobby, dogArrayList, map);
String s = JSON.toJSONString(xm);
System.out.println(s);
通过输出发现JSON格式有点乱,可以通过格式化的方式将输出的字符串转化成标准的JSON格式
String str = JSON.toJSONString(Object object, boolean prettyFormat);
prettyFormat:为true时,则格式化字符串,成标准的JSON格式,我们将上一个代码为例
// 其他都不变
String s = JSON.toJSONString(xm,true);
4. 其他类型转JSON
FastJson 还提供了许多特性的支持,如格式化日期,处理空值等
String str = JSON.toJSONString(Object object, SerializerFeature features)
SerializerFeature :序列化的特征,是一个枚举类型,具体类型可进SerializerFeature查看
java.util.Data 转 JSON
当不采用任何格式进行转化,FastJson会将 Date 转化成 Long
Date date = new Date();
String str1 = JSON.toJSONString(date);
输出结果:1616805889867
使用SerializerFeature.WriteDateUseDateFormat格式化日期后
Date date = new Date();
String str2 =JSON.toJSONString(date,SerializerFeature.WriteDateUseDateFormat);
System.out.println(str2);
输出结果:"2021-03-27 08:44:49"
也可以指定日期格式进行转化:JSON.toJSONStringWithDateFormat
Date date = new Date();
String str3 = JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd");
System.out.println(str3);
输出结果:"2021-03-27"
使用单引号进行输出,以上述Javabean 转 JSON为例
默认情况下,是以双引号
String s = JSON.toJSONString(xm,SerializerFeature.UseSingleQuotes);
输出null字段
默认情况下,不会输出
Map<String,Object> map=new HashMap<>();
String v1=null;
String v2="11";
map.put("k1",v1);
map.put("k2",v2);
String str4 = JSON.toJSONString(map);
System.out.println(str4);
输出结果:{"k2":"11"}
使用 SerializerFeature.WriteMapNullValue
String str5 = JSON.toJSONString(map,SerializerFeature.WriteMapNullValue);
System.out.println(str5);
输出结果:{"k1":null,"k2":"11"}
对非字符串的key值转化成字符
注意:key 才可以转化,value转不了
默认情况下:
Date date = new Date();
Map<Date,Object> map=new HashMap<>();
String v1="000";
map.put(date,v1);
String str6 = JSON.toJSONString(map);
System.out.println(str6);
输出结果:{1616807985732:"000"}
格式化后: SerializerFeature.WriteNonStringKeyAsString
String str6 = JSON.toJSONString(map,SerializerFeature.WriteNonStringKeyAsString);
System.out.println(str6);
输出结果:{"1616808045765":"000"}
序列化写入类的信息
Dog ww = new Dog("ww", 2);
String s = JSON.toJSONString(ww, SerializerFeature.WriteClassName);
System.out.println(s);
输出结果:{"@type":"java.util.HashMap",new Date(1616808415125):"000"}
4. 反序列化
反序列化就是将JSON字符串转化成对应的java bean对象
主要代码:JSON.parseObject(string, **.class)
1. JSON 转 java bean
以上面的java bean 转 JSON 为基础,得到转化后的字符串,又将转化成java bean对象
Student student = JSON.parseObject(s, Student.class);
System.out.println(student);
如果我们在java bean转 JSON 时加上类的信息,可以直接进行转化,不需要指定类
Student xm = new Student(1, "xm", 16, list, dogArrayList, map);
String s=JSON.toJSONString(xm,SerializerFeature.WriteClassName);
System.out.println(s);
Student student = (Student) JSON.parse(s);
System.out.println(student);
在自动转化时出现错误,通过从查找资料得到
问题产生的原因:在1.2.25之后的版本,以及所有的.sec01后缀版本中,autotype功能是受限的,和之前的版本不同,如果在升级的过程中遇到问题,可以通过以下方法配置。总而言之:在1.2.25版本过后,禁用了部分autotype功能,
解决办法:打开autotype,
官方解决办法:https://github.com/alibaba/fastjson/wiki/enable_autotype
方式一:加上jvm 启动参数
方式二 直接在代码上加上 ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
Student xm = new Student(1, "xm", 16, list, dogArrayList, map);
String s=JSON.toJSONString(xm,SerializerFeature.WriteClassName);
System.out.println(s);
Student student = (Student) JSON.parse(s);
System.out.println(student);
2. JSON 转 Map
String str="{\"phone\":\"15279146568\",\"id\":\"340826\"}";
System.out.println(str);
Map<String, Object> map1 = JSON.parseObject(str, new TypeReference<Map<String, Object>>() {});
System.out.println(map1.get("id"));
System.out.println(map1.get("phone"));
输出结果:
340826
15279146568
3. JSON 转 list
String str = "[{\"phone\":\"15279146568\",\"id\":\"340826\"},{\"sex\":\"male\",\"name\":\"xiaoming\"}]";
System.out.println(str);
List<Map> list1 = JSON.parseArray(str, Map.class);
Object[] objects = list.toArray(); // list 转 数组
String s = Arrays.toString(objects); // 数组 转 string
System.out.println(s);
输出结果:[{phone=15279146568, id=340826}, {sex=male, name=xiaoming}]
5. JSONObject,JSONArray
JSONObject,JSONArray是JSON的两个子类。
JSONObject相当于 Map<String, Object>
JSONArray相当于 List
JSONobject
HashMap<String, Object> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
JSONObject jsonObject = new JSONObject(map);
jsonObject.put("k3","v3");
Object k1 = jsonObject.get("k1");
Object k2 = jsonObject.get("k2");
Object k3 = jsonObject.get("k3");
System.out.println(k1);
System.out.println(k2);
System.out.println(k3);
输出结果:
v1
v2
v3
JSONAaary
List<Map<String,String>> list=new LinkedList<>();
HashMap<String, String> map = new HashMap<>();
map.put("id","340826");
map.put("phone","15279146568");
HashMap<String, String> map2 = new HashMap<>();
map2.put("name","xiaoming");
map2.put("sex","male");
list.add(map);
list.add(map2);
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(list));
JSONObject jsonObject = jsonArray.getJSONObject(0);
Object id = jsonObject.get("id");
System.out.println(id);
Object[] objects = jsonArray.toArray();
String s = Arrays.toString(objects);
System.out.println(s);