如何使用Java删除JSONArray元素

6
我的JsonArray是:
[{
"Id": null,
"Name": "One New task",
"StartDate": "2010-02-03T05:30:00",
"EndDate": "2010-02-04T05:30:00",
"Duration": 1,
"DurationUnit": "d",
"PercentDone": 0,
"ManuallyScheduled": false,
"Priority": 1,
"parentId": 8,
"index": 0,
"depth": 3,
"checked": null },{
"Id": null,
"Name": "New task",
"StartDate": "2010-02-04T05:30:00",
"EndDate": "2010-02-04T05:30:00",
"Duration": 0,
"DurationUnit": "d",
"PercentDone": 0,
"ManuallyScheduled": false,
"Priority": 1,
"parentId": 8,
"index": 1,
"depth": 3,
"checked": null }]

现在我想从这个JsonArray中删除Id、ManuallyScheduled和checked,我尝试在JAVA中使用jsonArray.remove(1)和jsonArray.discard("Id"),但是什么也没有发生。我删除数组项的方法错了吗?我使用JAVA技术。
3个回答

9
您手头的是一个对象数组。因此,您需要循环遍历该数组并从每个对象中删除所需数据,例如:
for (int i = 0, len = jsonArr.length(); i < len; i++) {
    JSONObject obj = jsonArr.getJSONObject(i);
    // Do your removals
    obj.remove("id");
    // etc.
}

我假设你正在使用org.json.JSONObjectorg.json.JSONArray,但无论你使用哪个JSON处理库,原则都是相同的。
如果你想将像[{"id":215},{"id":216}]这样的内容转换为[215,216],你可以这样做:
JSONArray intArr = new JSONArray();
for (int i = 0, len = objArr.length(); i < len; i++) {
    intArr.put(objArr.getJSONObject(i).getInt("id"));
}

嗨,我遇到了同样的问题。我收到的日期格式为2012-01-30T00:00:00,那么我该如何将其分配给我的JAVA pojo类中的Date变量startDate? - yaryan997
我认为你需要使用.getString("date"),然后手动解析String,使用类似于SimpleDateFormat的东西将其转换为Date - jabclab
我该如何将我收到的日期字符串使用SimpleDateFormat从字符串转换为日期? 你有任何想法吗? 我的字符串日期是2012-01-30T00:00:00。 - yaryan997
我尝试使用您的解决方案,但不知道为什么我的sysout不能工作。我无法使用 SimpleDateFormat sdf = new SimpleDateFormat("YY-MM-DD"); Date d = sdf.parse(jsonObject.getString("StartDate").split("T")[0]); 进行解析。我的Java控制台没有给出任何错误,并且该行未执行。 - yaryan997
尝试使用yyyy-MM-dd作为SimpleDateFormat模式。 - jabclab
显示剩余4条评论

2
以下方法将在数组中查找具有匹配的id的对象,然后返回过滤后的数组。
public JSONArray removeObject(JSONArray array, String id) throws JSONException {
    for (int i = 0; i < array.length(); i++) {
        JSONObject obj = array.getJSONObject(i);
        if (obj.getString("ID").equals(id)) {
            array.remove(i);
            //  Toast.makeText(this, "ENCONTRADO", Toast.LENGTH_SHORT).show();
        }
    }
    return array;
}

2

有时在Android中,当您想直接使用JSON结构时,这很有用。

请注意,我仅在处理数组内的JSONObject时使用此功能。

public static JSONArray remove(final int idx, final JSONArray from) {
    final List<JSONObject> objs = asList(from);
    objs.remove(idx);

    final JSONArray ja = new JSONArray();
    for (final JSONObject obj : objs) {
        ja.put(obj);
    }

    return ja;
}

public static List<JSONObject> asList(final JSONArray ja) {
    final int len = ja.length();
    final ArrayList<JSONObject> result = new ArrayList<JSONObject>(len);
    for (int i = 0; i < len; i++) {
        final JSONObject obj = ja.optJSONObject(i);
        if (obj != null) {
            result.add(obj);
        }
    }
    return result;
}

1
为什么要添加到list<>而不是直接添加到新的JSONArray? - epeleg
是的,您可以这样做。我有未优化的版本,因为我已经为方便而拥有了asList方法。 - Rafael Sanches

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接