背景
在工作中需求在发送请求的参数中是要先校验某些字段,顺序会对请求结果造成影响,所以在转为JsonArray时遇到了字段按照字母进行排序从而打乱了原始的顺序的情况。借此记录当时的解决方法,不是最优解,有大佬想到了更好的方法帮忙留言。
现象
public static void main(String[] args) {
String jsonStr = "[{\"FMATERIALID\":\"CSCP002L18L\",\"FRMREALQTY\":1,\"ERP_SIC\":\"1438017\",\"FStockId\":\"001\"},{\"FMATERIALID\":\"CSCP002Z11M\",\"FRMREALQTY\":1,\"ERP_SIC\":\"1438018\",\"FStockId\":\"001\"}]";
JSONArray jsonArray = JSONArray.parseArray(jsonStr);
System.out.println(jsonArray);
}
结果是[{“FRMREALQTY”:1,“FMATERIALID”:“CSCP002L18L”,“ERP_SIC”:“1438017”,“FStockId”:“001”},{“FRMREALQTY”:1,“FMATERIALID”:“CSCP002Z11M”,“ERP_SIC”:“1438018”,“FStockId”:“001”}]
由此可见顺序被破坏掉了。
解决方法
public static void main(String[] args) {
String jsonStr = "[{\"FMATERIALID\":\"CSCP002L18L\",\"FRMREALQTY\":1,\"ERP_SIC\":\"1438017\",\"FStockId\":\"001\"},{\"FMATERIALID\":\"CSCP002Z11M\",\"FRMREALQTY\":1,\"ERP_SIC\":\"1438018\",\"FStockId\":\"001\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, Object>> list = JSON.parseObject(jsonStr, new ArrayList<LinkedHashMap<String, Object>>().getClass(),Feature.OrderedField);
JSONArray jsonArray = new JSONArray();
for (Map<String, Object> map : list) {
JSONObject jsonObject = new JSONObject(map);
jsonArray.add(jsonObject);
}
System.out.println(jsonArray);
}
[{“FMATERIALID”:“CSCP002L18L”,“FRMREALQTY”:1,“ERP_SIC”:“1438017”,“FStockId”:“001”},{“FMATERIALID”:“CSCP002Z11M”,“FRMREALQTY”:1,“ERP_SIC”:“1438018”,“FStockId”:“001”}]
JSONObject情况
那边对应jsonObject会是什么情况?
public static void main(String[] args) {
String jsonStr = "{\"FMATERIALID\":\"CSCP002L18L\",\"FRMREALQTY\":1,\"ERP_SIC\":\"1438017\",\"FStockId\":\"001\"}";
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
System.out.println(jsonObject);
}
{“FRMREALQTY”:1,“FMATERIALID”:“CSCP002L18L”,“ERP_SIC”:“1438017”,“FStockId”:“001”}
但是出现以下复杂情况却不一样
public static void main(String[] args) {
String jsonString = "{\"sign\":\"1\",\"courseList\":[{\"ERP_SIC\":\"1438017\",\"FMATERIALID\":\"CSCP002L18L\",\"FRMREALQTY\":1,\"FStockId\":\"001\"},{\"ERP_SIC\":\"1438018\",\"FMATERIALID\":\"CSCP002L18M\",\"FRMREALQTY\":1,\"FStockId\":\"001\"}],\"schoolCode\":\"1\"}";
System.out.println(jsonString);
JSONObject jsonObject = JSON.parseObject(jsonString);
System.out.println(JSON.toJSONString(jsonObject));
}
{“sign”:“1”,“courseList”:[{“ERP_SIC”:“1438017”,“FMATERIALID”:“CSCP002L18L”,“FRMREALQTY”:1,“FStockId”:“001”},{“ERP_SIC”:“1438018”,“FMATERIALID”:“CSCP002L18M”,“FRMREALQTY”:1,“FStockId”:“001”}],“schoolCode”:“1”}
{“sign”:“1”,“courseList”:[{“FRMREALQTY”:1,“FMATERIALID”:“CSCP002L18L”,“ERP_SIC”:“1438017”,“FStockId”:“001”},{“FRMREALQTY”:1,“FMATERIALID”:“CSCP002L18M”,“ERP_SIC”:“1438018”,“FStockId”:“001”}],“schoolCode”:“1”}
解决方法
public static void main(String[] args) {
String jsonString = "{\"sign\":\"1\",\"courseList\":[{\"ERP_SIC\":\"1438017\",\"FMATERIALID\":\"CSCP002L18L\",\"FRMREALQTY\":1,\"FStockId\":\"001\"},{\"ERP_SIC\":\"1438018\",\"FMATERIALID\":\"CSCP002L18M\",\"FRMREALQTY\":1,\"FStockId\":\"001\"}],\"schoolCode\":\"1\"}";
System.out.println(jsonString);
JSONObject jsonObject = JSON.parseObject(jsonString, Feature.OrderedField);
System.out.println(JSON.toJSONString(jsonObject));
}
{“sign”:“1”,“courseList”:[{“ERP_SIC”:“1438017”,“FMATERIALID”:“CSCP002L18L”,“FRMREALQTY”:1,“FStockId”:“001”},{“ERP_SIC”:“1438018”,“FMATERIALID”:“CSCP002L18M”,“FRMREALQTY”:1,“FStockId”:“001”}],“schoolCode”:“1”}
{“sign”:“1”,“courseList”:[{“ERP_SIC”:“1438017”,“FMATERIALID”:“CSCP002L18L”,“FRMREALQTY”:1,“FStockId”:“001”},{“ERP_SIC”:“1438018”,“FMATERIALID”:“CSCP002L18M”,“FRMREALQTY”:1,“FStockId”:“001”}],“schoolCode”:“1”}
Feature.OrderedField 是 JSON.parseObject 方法的一个参数,它用来告诉 JSON 解析器在解析 JSON 字符串时,是否要保留字段的顺序信息。