在默认情况下,Fastjson实现了JavaBean和JSON对象之间的映射。 此外,Fastjson还支持一种更精简的映射,可以实现JavaBean与JSON数组之间的映射。优点是序列化之后的JSON字符串更小,缺点是降低了可读性。 本篇内容基于Fastjson 1.2.62版本,马上开始学习吧。
默认的序列化方式
默认情况下,使用JSON.toJSONString序列化对象,转化为JSON对象字符串。
public class Animal {
private String name;
private int sex;
private Integer weight;
// 省略getter、setter方法
}
/**
* 默认序列化
*/
@Test
public void toJSONString() {
Animal animal = new Animal();
animal.setName("sam");
animal.setSex(1);
animal.setWeight(100);
System.out.println(JSON.toJSONString(animal));
}
执行结果:
{"name":"sam","sex":1,"weight":100}
实现JavaBean与JSON数组映射
JavaBean序列化为JSON数组
使用JSON.toJSONString进行序列化时,传入SerializerFeature.BeanToArray参数,启用从JavaBean到JSON数组的映射。
/**
* 序列化时启用SerializerFeature.BeanToArray.<br>
* 不序列化key,而是将value作为数组字符串输出,输出的json字符串更小,也节省了空间.<br>
* 官方测试数据表示,启用后性能更好.
*/
@Test
public void toJSONStringWithBeanToArray() {
Animal animal = new Animal();
animal.setName("sam");
animal.setSex(1);
animal.setWeight(100);
System.out.println(JSON.toJSONString(animal, SerializerFeature.BeanToArray));
}
执行结果:
["sam",1,100]
JSON数组反序列化为JavaBean
同样的,在反序列化的时候,传入Feature.SupportArrayToBean参数,启用将JSON数组反序列化为JavaBean。
/**
* 反序列化时启用Feature.SupportArrayToBean.<br>
* 支持将json数组反序列化为JavaBean.
*/
@Test
public void parseObjectWithBeanToArray() {
String jsonString = "[\"sam\",1,100]";
Animal animal = JSON.parseObject(jsonString, Animal.class, Feature.SupportArrayToBean);
System.out.println(JSON.toJSONString(animal));
}
执行结果:
{"name":"sam","sex":1,"weight":100}
使用JSONType注解实现类级别映射
如果只需要针对特定的类进行映射,可以使用JSONType注解来实现。
public class ArticleList {
private String name;
private List<Article> articles;
// 省略getter、setter方法
}
@JSONType(serialzeFeatures = SerializerFeature.BeanToArray, parseFeatures = Feature.SupportArrayToBean)
public class Article {
private String title;
private String content;
// 省略getter、setter方法
}
/**
* 在需要进行JSON数组映射的类,添加JSONType注解.
*/
@Test
public void toJSONStringWithJSONType() {
List<Article> articles = new ArrayList<>();
Article article = new Article();
article.setTitle("title1");
article.setContent("content1");
articles.add(article);
article = new Article();
article.setTitle("title2");
article.setContent("content2");
articles.add(article);
ArticleList articleList = new ArticleList();
articleList.setName("name");
articleList.setArticles(articles);
// 序列化
String jsonString = JSON.toJSONString(articleList);
System.out.println(jsonString);
// 反序列化
ArticleList newArticleList = JSON.parseObject(jsonString, ArticleList.class);
System.out.println(JSON.toJSONString(newArticleList));
}
执行结果:
{"articles":[["content1","title1"],["content2","title2"]],"name":"name"}
{"articles":[["content1","title1"],["content2","title2"]],"name":"name"}
使用JSONField注解实现字段级别映射
Fastjson还支持针对类的某个字段进行映射配置,使用JSONField注解进行声明。
public class AnimalParent {
private String name;
@JSONField(serialzeFeatures = SerializerFeature.BeanToArray, parseFeatures = Feature.SupportArrayToBean)
private Animal animal;
// 省略getter、setter方法
}
/**
* 在需要进行JSON数组映射的字段,添加JSONField注解.
*/
@Test
public void toJSONStringWithJSONField() {
Animal animal = new Animal();
animal.setName("sam");
animal.setSex(1);
animal.setWeight(100);
AnimalParent parent = new AnimalParent();
parent.setName("parent");
parent.setAnimal(animal);
// 序列化
String jsonString = JSON.toJSONString(parent);
System.out.println(jsonString);
// 反序列化
AnimalParent newParent = JSON.parseObject(jsonString, AnimalParent.class);
System.out.println(JSON.toJSONString(newParent));
}
执行结果:
{"animal":["sam",1,100],"name":"parent"}
{"animal":["sam",1,100],"name":"parent"}
小结
在普通模式下,序列化时JavaBean会映射成JSON对象。 Fastjson还支持一种叫做BeanToArray的映射模式,在该模式下,JavaBean将会映射为JSON数组。同时,JSON数组也可反序列化为JavaBean。 使用BeanToArray模式的优点是序列化之后的JSON字符串更小,节省空间,性能上也会有所提升。缺点是降低了可读性。 有3种方法可以启用BeanToArray模式:
1.在调用JSON类的序列化和反序列化方法时,传入启用BeanToArray模式的配置项;
2.为指定的类添加JSONType注解实现类级别映射;
3.为指定字段添加JSONField注解实现字段级别映射。
参考
https://github.com/alibaba/fastjson (opens in a new tab)
https://github.com/alibaba/fastjson/wiki/BeanToArray_en (opens in a new tab)