Fastjson基于BeanToArray模式实现JavaBean与JSON数组的映射

690 阅读3分钟

(本文是《轻松学习Fastjson》教程的第5篇文章)

在默认情况下,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注解实现字段级别映射。

参考

《轻松学习Fastjson》

github.com/alibaba/fas…

github.com/alibaba/fas…

关于我

公众号:二进制之路

教程:996geek.com

博客:binarylife.icu

二进制之路