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

在默认情况下,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》

https://github.com/alibaba/fastjson

https://github.com/alibaba/fastjson/wiki/BeanToArray_en


---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---

《Fastjson基于BeanToArray模式实现JavaBean与JSON数组的映射》有4条留言

  1. Hi! Quick question that’s entirely off topic. Do you know how to make your site mobile friendly?
    My web site looks weird when viewing from my iphone4.

    I’m trying to find a theme or plugin that might be able to fix this
    issue. If you have any recommendations, please share.
    Appreciate it!

    回复

留下评论