班级对象
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; }