一般情况下,我们用第三方插件如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": "北京"
}
}
评论区