我正在使用JSONObject来删除我在 JSON 字符串中不需要的 certin 属性:
JSONObject jsonObject = new JSONObject(jsonString);
jsonObject.remove("owner");
jsonString = jsonObject.toString();
Run Code Online (Sandbox Code Playgroud)
它工作正常,但问题是 JSONObject 是“名称/值对的无序集合”,我想保持 String 在通过 JSONObject 操作之前的原始顺序。
知道如何做到这一点吗?
我最近遇到了同样的问题,只是将我们所有的测试(期望 JSON 属性的顺序相同)转换到另一个 JSON 库:
<dependency>
    <groupId>org.codehaus.jettison</groupId>
    <artifactId>jettison</artifactId>
    <version>1.3.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
它在内部使用 a LinkedHashMap,它维护属性的顺序。这个库在功能上等同于这个json.org库,所以我看不出有什么理由不使用它,至少在测试中是这样。
您可以使用 com.google.gson 提供的 JsonObject,它与 org.json 提供的 JSONObject 几乎相同,但功能有所不同。为了将 String 转换为 Json 对象并保持顺序,您可以使用:
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(<Json String>, JsonObject.class);
Run Code Online (Sandbox Code Playgroud)
例如:-
String jsonString = "your json String";
JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class);
Run Code Online (Sandbox Code Playgroud)
它只是维护 JsonObject 与 String 的顺序。
尝试这个
JSONObject jsonObject = new JSONObject(jsonString) {
    /**
     * changes the value of JSONObject.map to a LinkedHashMap in order to maintain
     * order of keys.
     */
    @Override
    public JSONObject put(String key, Object value) throws JSONException {
        try {
            Field map = JSONObject.class.getDeclaredField("map");
            map.setAccessible(true);
            Object mapValue = map.get(this);
            if (!(mapValue instanceof LinkedHashMap)) {
                map.set(this, new LinkedHashMap<>());
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return super.put(key, value);
    }
};
jsonObject.remove("owner");
jsonString=jsonObject.toString();
Run Code Online (Sandbox Code Playgroud)
        你不能。
这就是为什么我们将其称为名称/值对的无序集合。
我不确定为什么你需要这样做。但如果你想排序,你就必须使用 json 数组。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           38698 次  |  
        
|   最近记录:  |