- 什么是 fastjson?
- fastjson 的优点
- 准备工作
- 自定义 JsonUtils
- 实际测试案例
- bena 转 json
- json 转 bean
- json 转 list
- json 转 map
- 类型构造器
- 相关链接
- 微信公众号
fastjson 是阿里巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
fastjson 的优点-
速度快
fastjson 相对其他 JSON 库的特点是快,从 2011 年`fastjson 发布 1.1.x 版本之后,其性能从未被其他 Java 实现的 JSON 库超越。 -
使用广泛
fastjson 在阿里巴巴大规模使用,在数万台服务器上部署,fastjson 在业界被广泛接受。在 2012 年被开源中国评选为最受欢迎的国产开源软件之一。 -
测试完备
fastjson 有非常多的 testcase,在 1.2.11 版本中,testcase 超过 3321 个。每次发布都会进行回归测试,保证质量稳定。 -
使用简单
fastjson 的 API 十分简洁。
String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化
- 功能完备
支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。
相关依赖
下载 jar 包:最新版 jar 包下载:1.2.53.jar
或者使用 Maven 引入
com.alibaba fastjson x.x.x
版本号可以通过 Maven Repository 查询,https://mvnrepository.com/
测试实体类
这里使用了lombok插件,不会的可以根据注解的意思,自己加上相应的方法。
org.projectlombok lombok
测试实体类
@Data // get,set
@NoArgsConstructor // 无参构造方法
@AllArgsConstructor // 有参构造方法
public class User implements Serializable {
private String username;
private String password;
private Integer age;
}
自定义 JsonUtils
package cn.tellsea;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@Slf4j
public class JsonUtils {
public static final ObjectMapper mapper = new ObjectMapper();
public static String toString(Object obj) {
if (obj == null) {
return null;
}
if (obj.getClass() == String.class) {
return (String) obj;
}
try {
return mapper.writevalueAsString(obj);
} catch (JsonProcessingException e) {
log.error("json序列化出错toString:" + obj, e);
return null;
}
}
public static T toBean(String json, Class tClass) {
try {
return mapper.readValue(json, tClass);
} catch (IOException e) {
log.error("json解析出错toBean:" + json, e);
return null;
}
}
public static List toList(String json, Class eClass) {
try {
return mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, eClass));
} catch (IOException e) {
log.error("json解析出错toList:" + json, e);
return null;
}
}
public static Map toMap(String json, Class kClass, Class vClass) {
try {
return mapper.readValue(json, mapper.getTypeFactory().constructMapType(Map.class, kClass, vClass));
} catch (IOException e) {
log.error("json解析出错toMap:" + json, e);
return null;
}
}
public static T nativeRead(String json, TypeReference type) {
try {
return mapper.readValue(json, type);
} catch (IOException e) {
log.error("json解析出错nativeRead:" + json, e);
return null;
}
}
}
实际测试案例
这里我直接贴全代码,后面再逐一说明,方便大家参考。
package cn.tellsea;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Map;
public class FastJsonTest {
public static void main(String[] args) {
User user = new User("tellsea", "123456", 20);
// bean转json
String json = JsonUtils.toString(user);
System.out.println(json);
// json转bean
User toBean = JsonUtils.toBean(json, User.class);
System.out.println(toBean);
// json转list
String jsonList = "[" +
"{"username":"tellsea","password":"123456","age":20}, " +
"{"username":"goodtime","password":"666888","age":22}, " +
"{"username":"嘻嘻哈哈","password":"999999","age":18}]";
JsonUtils.toList(jsonList, User.class).forEach(temp -> System.out.println(temp));
// json转map
Map toMap = JsonUtils.toMap(json, String.class, Object.class);
for (Map.Entry entry : toMap.entrySet()) {
System.out.println("key:" + entry.getKey() + ", value" + entry.getValue());
}
// 类型构造器
Map read = JsonUtils.nativeRead(json, new TypeReference
前面第一行代码中new一个 User,后面使用的时候,大家别萌币 o((⊙﹏⊙))o
bena 转 jsonString json = JsonUtils.toString(user);
测试结果
{"username":"tellsea","password":"123456","age":20}
json 转 bean
User toBean = JsonUtils.toBean(json, User.class);
测试结果
User(username=tellsea, password=123456, age=20)json 转 list
String jsonList = "[" +
"{"username":"tellsea","password":"123456","age":20}, " +
"{"username":"goodtime","password":"666888","age":22}, " +
"{"username":"嘻嘻哈哈","password":"999999","age":18}]";
JsonUtils.toList(jsonList, User.class).forEach(temp -> System.out.println(temp));
forEach() 是 jdk1.8 的新特性,你可以直接遍历也行。
测试结果
User(username=tellsea, password=123456, age=20) User(username=goodtime, password=666888, age=22) User(username=嘻嘻哈哈, password=999999, age=18)json 转 map
MaptoMap = JsonUtils.toMap(json, String.class, Object.class); for (Map.Entry entry : toMap.entrySet()) { System.out.println("key:" + entry.getKey() + ", value" + entry.getValue()); }
测试结果
key:username, value:tellsea key:password, value:123456 key:age, value:20类型构造器
通过传入不同的类型,将结果解析为相对应的类型,这里我测试了两种。
测试 json 转 bean
User read1 = JsonUtils.nativeRead(json, new TypeReference() { });
测试结果
User(username=tellsea, password=123456, age=20)
实体类对象转为键值对的形式
Mapread = JsonUtils.nativeRead(json, new TypeReference
测试结果
key:username, value:tellsea key:password, value:123456 key:age, value:20相关链接
- Fastjson 源码地址:https://github.com/alibaba/fastjson
- Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN



