使用org.json库如何保持JSON文件的键顺序?
解决org.json生成JSON时键顺序混乱的问题
你遇到的这个键顺序不一致的问题,本质是因为org.json库的JSONObject默认采用无序的哈希结构(类似HashMap)存储键值对,它不会保留你调用put()方法时的插入顺序,所以每次序列化后键的排列都会"乱序"。虽然不影响程序运行,但确实会给手动编辑带来麻烦,下面给你两种可行的解决方案:
方案1:用LinkedHashMap维护插入顺序(兼容所有org.json版本)
LinkedHashMap会严格保留键值对的插入顺序,我们可以先把需要的键值对存入LinkedHashMap,再用这个Map来初始化JSONObject,这样生成的JSON就会遵循你想要的顺序。
修改你的代码如下:
public static void CreateJSON() throws JSONException { List<String> projList = new ArrayList<>(); List<String> statsList = new ArrayList<>(); projList.add("Reave Bomb"); projList.add("Purple Fire"); projList.add("Twilight Ball"); statsList.add("speed"); statsList.add("damage"); // 用LinkedHashMap维护upgrades内部的顺序 Map<String, Object> upgradeMap = new LinkedHashMap<>(); for (String i : projList) { Map<String, Object> projMap = new LinkedHashMap<>(); for (String j : statsList) { projMap.put(j.toLowerCase(), 1); } upgradeMap.put(i, new JSONObject(projMap)); } JSONObject upgradeJSON = new JSONObject(upgradeMap); // 用LinkedHashMap维护根节点的键顺序 Map<String, Object> selfMap = new LinkedHashMap<>(); selfMap.put("name", ""); selfMap.put("credits", 500); selfMap.put("health", 100); selfMap.put("aura", 100); selfMap.put("upgrades", upgradeJSON); JSONObject selfJSON = new JSONObject(selfMap); System.out.println(selfJSON.toString()); try (FileWriter file = new FileWriter("val/player.json")) { file.write(selfJSON.toString(4)); } catch (IOException e) { e.printStackTrace(); } }
方案2:使用org.json的有序构造方法(仅适用于20230618及以后版本)
如果你使用的是较新的org.json版本,库中新增了一个带布尔参数的JSONObject构造方法,直接传入true就能创建保留插入顺序的对象,不需要额外使用LinkedHashMap,代码会更简洁:
public static void CreateJSON() throws JSONException { List<String> projList = new ArrayList<>(); List<String> statsList = new ArrayList<>(); projList.add("Reave Bomb"); projList.add("Purple Fire"); projList.add("Twilight Ball"); statsList.add("speed"); statsList.add("damage"); // 创建有序的upgradeJSON JSONObject upgradeJSON = new JSONObject(10, true); for (String i : projList) { // 创建有序的projObj JSONObject projObj = new JSONObject(2, true); for (String j : statsList) { projObj.put(j.toLowerCase(), 1); } upgradeJSON.put(i, projObj); } // 创建有序的根节点selfJSON JSONObject selfJSON = new JSONObject(10, true); selfJSON.put("name", ""); selfJSON.put("credits", 500); selfJSON.put("health", 100); selfJSON.put("aura", 100); selfJSON.put("upgrades", upgradeJSON); System.out.println(selfJSON.toString()); try (FileWriter file = new FileWriter("val/player.json")) { file.write(selfJSON.toString(4)); } catch (IOException e) { e.printStackTrace(); } }
两种方案都能让生成的JSON键顺序和你插入的顺序完全一致,你可以根据自己使用的org.json版本选择合适的方式。
内容的提问来源于stack exchange,提问作者MusicDev
相关产品推荐
相关产品推荐

