@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的字段排到了前面。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐