@JSONField是做什么用的
@JSONField是fastjson的一个注解,在fastjson解析一个类为Json对象时,作用到类的每一个属性(field)上。
通过用@JSONField注解一个类的属性,我们可以达到以下目标
- 指定field对应的key名称:@JSONField(name = “NaMe”)
- 对于时间字段,指定其格式:@JSONField(format = “yyyy-MM-dd HH:mm:ss”)
- 不序列化某些字段:@JSONField(serialize = false)
- 指定顺序:@JSONField(ordinal = 1)
- 当然,以上注解里的属性,可以同时使用:@JSONField(name = “nAmE”, format = “yyyy-MM-dd HH:mm”)
上demo
我们直接用demo代码来简单清晰的看一下,加了这些注解的效果吧!
我们来定义三个类,这三个类字段一毛一样,只是注解不同。
一个订单实体
/*** 一个订单实体** @author xiaobai* @date 2020/11/14*/
@Data
@Builder
public class Order {/*** 主键id*/long id;/*** 订单编码*/String code;/*** 订单标题*/String title;/*** 订单价格*/double price;/*** 订单类型*/int orderType;/*** 订单创建时间*/Date ctime;/*** 订单支付时间*/Date payTime;
}
一个有注解的订单实体
/*** 一个有注解的订单实体** @author xiaobai* @date 2020/11/14*/
@Data
@Builder
public class OrderWithAnnotation {/*** 主键id*/@JSONField(serialize = false)long id;/*** 订单编码*/String code;/*** 订单标题*/String title;/*** 订单价格*/double price;/*** 订单类型*/@JSONField(name = "order_type")int orderType;/*** 订单创建时间*/@JSONField(format = "yyyy-MM-dd HH:mm:ss")Date ctime;/*** 订单支付时间*/@JSONField(name = "pay_time", format = "yyyy-MM-dd HH:mm")Date payTime;
}
一个只有顺序注解的订单实体
/*** 一个只有顺序注解的订单实体** @author xiaobai* @date 2020/11/14*/
@Data
@Builder
public class OrderWithOrdinal {/*** 主键id*/@JSONField(ordinal = 9)long id;/*** 订单编码*/@JSONField(ordinal = 9)String code;/*** 订单标题*/@JSONField(ordinal = 1)String title;/*** 订单价格*/@JSONField(ordinal = 2)double price;/*** 订单类型*/@JSONField(ordinal = 9)int orderType;/*** 订单创建时间*/@JSONField(ordinal = 3)Date ctime;/*** 订单支付时间*/@JSONField(ordinal = 9)Date payTime;
}
执行
用这三个类各自生成一个对象,赋值完全相同,然后用fastjson输出Json格式的字符串。
public class KnowJSONField {@Testpublic void test() {Order order = Order.builder().id(10001L).code("ABC001").title("iPhone 12 即刻下单").orderType(1).price(6688).ctime(new Date()).payTime(new Date()).build();OrderWithAnnotation orderWithAnnotation = OrderWithAnnotation.builder().id(10001L).code("ABC001").title("iPhone 12 即刻下单").orderType(1).price(6688).ctime(new Date()).payTime(new Date()).build();OrderWithOrdinal orderWithOrdinal = OrderWithOrdinal.builder().id(10001L).code("ABC001").title("iPhone 12 即刻下单").orderType(1).price(6688).ctime(new Date()).payTime(new Date()).build();String s1 = JSON.toJSONString(order);String s2 = JSON.toJSONString(orderWithAnnotation);String s3 = JSON.toJSONString(orderWithOrdinal);System.out.println("原始的order:");System.out.println(s1);System.out.println("有注解的order:");System.out.println(s2);System.out.println("只有顺序注解的order:");System.out.println(s3);}
}
输出结果如下,已经将需要重点关注的地方标注了出来。对比之下,一目了然。
- 红色是@JSONField(format = “yyyy-MM-dd HH:mm:ss”)的对比,时间进行格式化。
- 绿色是@JSONField(serialize = false)的对比,序列化时直接略过。
- 蓝色是加了@JSONField(name = “pay_time”, format = “yyyy-MM-dd HH:mm”)的对比,字段定义修改了,时间也完成了格式化。
- 黄色是@JSONField(ordinal = 1)的对比,顺序被指定为1、2、3的字段排到了前面。
好啦,就酱。