场景:流水数据推送,一条数据中多个字段需要排序后生成签名,但是项目上发送端的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;
// 最后按照名称顺序排序

Logo

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

更多推荐