一眼看清@JSONField注解使用与效果
·
@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 {
@Test
public 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的字段排到了前面。
更多推荐
已为社区贡献3条内容
所有评论(0)