侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 297 篇文章
  • 累计创建 134 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Json 序列化时指定顺序

孔子说JAVA
2022-08-17 / 0 评论 / 0 点赞 / 48 阅读 / 1,985 字 / 正在检测是否收录...

一般情况下,我们用第三方插件如fastJson、Jackson等将JavaBean转换为Json数据并不需要指定json属性的顺序,但在某些特定场景下有对属性顺序的严格要求,如我们需要对Json数据格式进行加密,如果顺序不一致将会导致同样的数据获取到不同结果,这就要求每次json序列化时的属性顺序都一致。

1、fastJson 指定序列化顺序

1.1 方法一

在JavaBean上加JSONType注解,指定JSON转换时的顺序。

@Data
@JSONType(orders={"country","province","city"})
public class JsonDemo {
 
    /**
     * 省份
     */
    private String province;
 
    /**
     * 国家
     */
    private String country;
 
    /**
     * 城市
     */
    private String city;
    
    /**
     * token
     */
    @JSONField(serialize = false)
    private String access_token;
}

1.2 方法二

在JavaBean的属性上添加注解 @JSONField(),如 @JSONField(ordinal = 1, name = “Version”),其中ordinal指定序列化顺序,name指定序列化后Json数据格式key的名称。ordinal 和 name 属性非必填。

@Data
public class JsonDemo {
 
    /**
     * 省份
     */
    @JSONField(ordinal = 2)
    private String province;
 
    /**
     * 国家
     */
    @JSONField(ordinal = 1, name = “Country”)
    private String country;
 
    /**
     * 城市
     */
    @JSONField(ordinal = 3)
    private String city;
    
    /**
     * token
     */
    @JSONField(serialize = false)
    private String access_token;
}

当serialize = false 时,调用JSON.tojsonString() 方法时对应属性会被过滤。

注:在使用注解之前,一定要检查自己封装的成员属性的规则是否符合java的基本规范,首字母小写的驼峰格式,否则注解不会生效,不生效的原因,仍然是java的内省机制导致的。

1.3 方法三(推荐)

在具体JSON转换时指定顺序参数 SerializerFeature.SortField 。

JsonDemo jsonDemo = new JsonDemo();
jsonDemo.setCountry("中国")
jsonDemo.setProvince("北京");
jsonDemo.setCity("北京");
System.out.println(JSON.toJSONString(jsonDemo, SerializerFeature.SortField, SerializerFeature.WriteMapNullValue));

2、Jackson 指定序列化顺序

2.1 方法一

类加上注解@JsonPropertyOrder,里面按需要指定的顺序写上字段。

@Data
@JsonPropertyOrder({"country", "province", "city"})
public class JsonDemo {
 
    /**
     * 省份
     */
    private String province;
 
    /**
     * 国家
     */
    private String country;
 
    /**
     * 城市
     */
    private String city;
}

2.2 方法二

在JavaBean的属性上加上注解@JsonProperty,通过value指定顺序(数字越小越靠前)

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class JsonDemo {
 
    /**
     * 省份
     */
    @JsonProperty(index = 2)
    private String province;
 
    /**
     * 国家
     */
    @JsonProperty(index = 1)
    private String country;
 
    /**
     * 城市
     */
    @JsonProperty(index = 3)
    private String city;
 
}

输出结果(因为city没有值,为null,而且设置了 @JsonInclude(JsonInclude.Include.NON_NULL), 所以没有显示该字段):

{
    "jsonDemo": {
        "country": "中国",
        "city": "北京"
    }
}
0

评论区