一眼看清@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的字段排到了前面。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值