全解史上最快的JOSN解析库 - alibaba Fastjson (2)

班级对象

public class Grade { private Long id; private String name; private List<Student> users = new ArrayList<Student>(); // 省略 setter、getter public void addStudent(Student student) { users.add(student); } @Override public String toString() { return "Grade{" + "id=" + id + ",\'' + ", users=" + users + '}'; } }

学生对象

public class Student { private Long id; private String name; // 省略 setter、getter @Override public String toString() { return "Student{" + "id=" + id + ",\'' + '}'; } }

运行的 Main 函数

public class MainTest { public static void main(String[] args) { Grade group = new Grade(); group.setId(0L); group.setName("admin"); Student student = new Student(); student.setId(2L); student.setName("guest"); Student rootUser = new Student(); rootUser.setId(3L); rootUser.setName("root"); group.addStudent(student); group.addStudent(rootUser); // 转换为 JSON String jsonString = JSON.toJSONString(group); System.out.println("JSON字符串:" + jsonString); // 转换为 对象BEAN Grade grade = JSON.parseObject(jsonString, Grade.class); System.out.println("JavaBean对象:" + grade); } }

最后的运行结果如下:

JSON字符串: {"id":0,"name":"admin","users":[{"id":2,"name":"guest"},{"id":3,"name":"root"}]} JavaBean对象: Grade{id=0,, users=[Student{id=2,}, Student{id=3,}]} 将对象中的空值输出

在fastjson中,缺省是不输出空值的。无论Map中的null和对象属性中的null,序列化的时候都会被忽略不输出,这样会减少产生文本的大小。但如果需要输出空值怎么做呢?

如果你需要输出空值,需要使用 SerializerFeature.WriteMapNullValue

Model obj = ...; JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue);

几种空值特别处理方式:

SerializerFeature 描述
WriteNullListAsEmpty   将Collection类型字段的字段空值输出为[]  
WriteNullStringAsEmpty   将字符串类型字段的空值输出为空字符串 ""  
WriteNullNumberAsZero   将数值类型字段的空值输出为0  
WriteNullBooleanAsFalse   将Boolean类型字段的空值输出为false  

具体的示例参考如下,可以同时选择多个:

class Model { public List<Objec> items; } Model obj = ....; String text = JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty); Fastjson 处理日期

Fastjson 处理日期的API很简单,例如:

JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")

使用ISO-8601日期格式

JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);

全局修改日期格式

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

反序列化能够自动识别如下日期格式:

ISO-8601日期格式

yyyy-MM-dd

yyyy-MM-dd HH:mm:ss

yyyy-MM-dd HH:mm:ss.SSS

毫秒数字

毫秒数字字符串

.NET JSON日期格式

new Date(198293238)

虽然上面处理了单个的日期类型和全局的日期类型格式的配置,但是有时候我们需要的是对象中个别的日期类型差异化,并不一定是同一种格式的。那如何处理呢?接下来介绍 Fastjson 的定制序列化。

Fastjson 定制序列化 简介

fastjson支持多种方式定制序列化。

通过@JSONField定制序列化

通过@JSONType定制序列化

通过SerializeFilter定制序列化

通过ParseProcess定制反序列化

使用@JSONField配置 1、JSONField 注解介绍 package com.alibaba.fastjson.annotation; public @interface JSONField { // 配置序列化和反序列化的顺序,1.1.42版本之后才支持 int ordinal() default 0; // 指定字段的名称 String name() default ""; // 指定字段的格式,对日期格式有用 String format() default ""; // 是否序列化 boolean serialize() default true; // 是否反序列化 boolean deserialize() default true; } 2、JSONField配置方式

可以把@JSONField配置在字段或者getter/setter方法上,例如:

配置在字段上

public class VO { @JSONField(name="ID") private int id; @JSONField(name="birthday",format="yyyy-MM-dd") public Date date; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywfjd.html