You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:55:59