Fastjson @JsonField注解使用

Posted cknds

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fastjson @JsonField注解使用相关的知识,希望对你有一定的参考价值。

【引言】

在开发中,不论是前后端联调,还是与第三方对接,有时候难免会遇到对方定义的json数据中的key值与自己后端定义的实体字段不一致的情况,也有时候会遇到前端传的日期数据需要进行格式转换的问题。本篇博客接下来要总结的这个注解,可以很方便的处理我们的问题,下面就一起看看如何使用。

【实例】

一. @JsonField注解

JsonField注解是阿里开发的fastjson中的注解,代码如下

// 若属性是私有的,必须有set*方法。否则无法反序列化。
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才?持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对?期格式有?
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}

可以配置在getter/setter?法或者字段上。我们项目中使用了Lombok插件,省去了get/set方法,所以直接配置在字段上使用,如下:

    /**
     * 应收款
     */
    @JSONField(name = "YS")
    private BigDecimal receivables;

    /**
     * 付款方式
     */
    @JSONField(name = "FKFS")
    private String payType;

    /**
     * 确认操作员
     */
    @JSONField(name = "PER")
    private String person;
    ...

以上代码中,JsonField注解中name中的值,诸如YS,PER等,就是与第三方对接返回给我们的数据字段以及我们调用其接口需要传给他们的字段,我们的实体肯定不能按这样的字段定义,我们也不能要求别人把接口都修改一遍,所以,使用这个注解,可以直接实现对方的json字段与我们实体的字段分别对应,也不需要做任何修改。

  1. 除了上面name的使用,JsonField还可以指定字段是否序列化,字段顺序及字段的输出格式,代码示例如下:
//1. 指定字段不序列化
    @JSONField(serialize=false)
    public Date date;

//2.  指定字段顺序
    @JSONField(ordinal = 3)
    private int f0;
    @JSONField(ordinal = 2)
    private int f1;
    @JSONField(ordinal = 1)
    private int f2;

//3. 配置date序列化和反序列使?yyyyMMdd?期格式
    @JSONField(format="yyyyMMdd")
    public Date date;

关于FastJson属性别名的问题,网上很多文章都指出@JSONField(name = "***")必须要注解在setter和getter上面;

但是实际测试compile ‘com.alibaba:fastjson:1.1.56‘版本的FastJson发现@JSONField注解其实可以直接写到属性名上面

 

JSONObject对象里字段排序问题

String student = JSONObject.toJSONString(student, SerializerFeature.SortField.MapSortField); //指定顺序输出,同时在 bean的属性上标记 @JSONField(ordinal = 序号)

或者在插入Json元素的时候,先后排序可以直接在创建实例之时指定
        JSONObject jsonObject = new JSONObject(true);
        jsonObject.put("a","1");
        jsonObject.put("b","2");
        jsonObject.put("c","3");
        jsonObject.put("d","4");
        jsonObject.put("e","5");
        jsonObject.put("ac","6");
        System.out.println(JSONObject.toJSONString(jsonObject);

 

 

ref: https://blog.csdn.net/hu_zhiting/article/details/85239765?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

以上是关于Fastjson @JsonField注解使用的主要内容,如果未能解决你的问题,请参考以下文章

fastjson简单使用demo,@JSONField注解属性字段上与setget方法上。实体类toString(),实体类转json的区别;_下划线识别

fastjson的@JSONField注解

FastJson中@JSONField注解使用

源码分析之FastJson全局配置日期格式导致@JSONField(format = "yyyy-MM-dd")注解失效

@JSONField注解的使用

fastJson的@JSONField和jackson的@JsonProperty使用