从 json 文件中删除子属性

Posted

技术标签:

【中文标题】从 json 文件中删除子属性【英文标题】:Delete a child attribute from json file 【发布时间】:2016-09-02 16:13:27 【问题描述】:

我在 Java 中有以下 HTTP JSON 响应,它代表一个用户对象。


    "account": "Kpatrick",
    "firstname": "Patrick",
    [
    ],
    "instances":
    [
        
            "id": "packerer-pool",
            "key": "packerer-pool123",
            "userAccount": "kpatrick",
            "firstname": "Patrick",
            "lastname": "Schmidt",

        
    ],
    "projects":
    [
        
            "id": "packerer-projectPool",
            "projectKey": "projectPool-Pool",
            "cqprojectName": "xxxxx",
        ,
       
            "id": "packerer-secondproject",
            "projectKey": "projectPool-Pool2",
            "cqprojectName": "xxxx",

        ,
        
            "id": "packerer-thirdproject",
            "projectKey": "projectPool-Pool3",
            "cqprojectName": "xxxx",
        
    ],

    "clients":
    [
    ],
    "dbid": 76864576,
    "version": 1,
    "id": "dbpack21"

现在,我想借助projectkey(例如“projectPool-Pool2”)搜索特定项目。之后,我想完全删除该元素。因为我的目标是在没有这个项目的情况下发送 HTTP 后调用。

我的 HTTP post-call 的结果应该类似于以下:

    
    "account": "Kpatrick",
    "firstname": "Patrick",
    [
    ],
    "instances":
    [
        
            "id": "packerer-pool",
            "key": "packerer-pool123",
            "userAccount": "kpatrick",
            "firstname": "Patrick",
            "lastname": "Schmidt",

        
    ],
    "projects":
    [
        
            "id": "packerer-projectPool",
            "projectKey": "projectPool-Pool",
            "cqprojectName": "xxxxx",
        ,
        
            "id": "packerer-thirdproject",
            "projectKey": "projectPool-Pool3",
            "cqprojectName": "xxxx",
        
    ],

    "clients":
    [
    ],
    "dbid": 76864576,
    "version": 1,
    "id": "dbpack21"

首先,我将响应解析为字符串。

    private static String getContent(HttpResponse response) 
    HttpEntity entity = response.getEntity();
    if (entity == null) return null;
    BufferedReader reader;
    try 
        reader = new BufferedReader(new InputStreamReader(entity.getContent()));
        String line = reader.readLine();
        reader.close();
        return line;
     catch (IllegalStateException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    
    return null;

现在我正在尝试搜索特定项目,但我不知道如何继续。

String StringResponse = getContent(JsonResponse);
JSONObject jsonObject = new JSONObject(StringResponse);
JSONArray ProjectsArray= jsonObject.getJSONArray("projects");

这种方法正确吗?

最好的问候!

【问题讨论】:

最后代码段中的StringResponse 和 ProjectArray 应该是小写的,因为它们是对象而不是类。 感谢您的快速回放。我还能怎么处理? 小写变量只是一个小的约定问题。查看我对问题的回答 这是一个有效的JSON,你能解析它吗?我收到多个错误。如果您可以发布有效的 JSON ,则更容易测试 我已经更正了两个逗号和一个剪辑。它现在有效吗?现在应该没事了!这是我的 HttpGet - 方法的响应。这就是问题所在,我想解析它,但我不能或者我想删除一个特定的项目:( 【参考方案1】:

一旦你有你的阵列,尝试类似...

// Array to store the indexes of the JSONArray to remove
ArrayList<Integer> indexesToRemove = new ArrayList<Integer>();
// Iterate through projects array, check the object at each position
// if it contains the string you want, add its index to the removal list
for (int i = 0; i < projectsArray.length; i++) 
    JSONObject current = projectsArray.get(i);
    if (current.get("projectKey") == "**DESIRED PROJECT KEY**") 
        indexesToRemove.add(i);
     

现在您可以遍历索引来删除,并使用 JSONArrays remove 方法从数组中删除相应的对象(不知道它叫什么,上面的代码来自内存)。确保删除您的项目 BACKWARDS,否则您将删除较早的项目,这将更改索引,如果您随后删除另一个索引,则会导致您删除不正确的项目。

// Going through the list backwards so we can remove the highest item each 
//time without affecting the lower items
for (int i = indexesToRemove.size()-1; i>=0; i--) 
    projectsArray.remove(indexesToRemove.get(i));

【讨论】:

感谢您的重播!我收到错误:org.json.JSONException: JSONObject["projects"] not found。那是对象还是属性?因为“项目”甚至有自己的属性。我完全不明白:-/ 对不起,我本来想回答你的第二个问题,但我一直走神。将来当您使用 JSON 时,如果您发现难以阅读原始格式,最好使用 JSON 查看器,这样可以更容易地了解您的添加/检索操作为何不起作用。很高兴你把它分类了!

以上是关于从 json 文件中删除子属性的主要内容,如果未能解决你的问题,请参考以下文章

sed 从 json 字符串中删除 json 子对象

从字符串中动态删除子字符串

将子对象从 JSON 绑定到父属性 java

从 powershell 中的 JSON 文件中提取子字符串

CMFCPropertyGridProperty怎么删除子项

从 JSON 文件中删除 JSON 对象