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);