场景:流水数据推送,一条数据中多个字段需要排序后生成签名,但是项目上发送端的fastjson版本是1.2.71,接收端是1.1.41(字段自动排序)
方法一:最后加入JSONArray的时候排序
JSONArray array = new JSONArray();
// 字段排序 data为实体类数据
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(data);
Map jsonMap = jsonObject.getInnerMap();
TreeMap treeMap = new TreeMap(jsonMap);
array.add(treeMap);
补充:自己的第一次遇到这个问题时这样可以解决排序,第二次遇到的时候,同样的代码复制上去就是不行,版本啥的都一样但是就是生成签名不一样,最后发现是空格转换的问题:老版本在加入JSONArray的时候将空格转成了\u00A0,而高版本空格还是空格,所以生成的签名调用的时候一直错误。然后,手动转换:json数组toString()后,将空格替换成\u00A0就可以了。但是最后又试了一遍空格不手动转,又可以了,真的神奇。
下面两个方法借鉴:fastjson排序问题-如何改变fastjson的排序规则_一年e度的夏天的博客-CSDN博客_fastjson 排序
方法二:利用注解@JSONField的ordinal属性指定字段的顺序。这个特性需要1.1.42以上版本。
@JSONField(ordinal = 1)
@ApiModelProperty("车牌颜色")
private String carColor;
@JSONField(ordinal = 2)
@ApiModelProperty("实收金额")
private String chargeMoney;
// 最后会按照ordinal 的顺序
方法三:如果上面一种方法不行,或者没有达到你的要求,那么下面的也可以了
也可以人为改变json串的名称
@JSONField(name = "a")
@ApiModelProperty("车牌颜色")
private String carColor;
@JSONField(name = "b")
@ApiModelProperty("实收金额")
private String chargeMoney;
// 最后按照名称顺序排序