如何从JSONArray中删除特定元素?

时间:2012-01-11 14:01:21

标签: java android arrays json

我正在构建一个应用程序,我从服务器请求一个PHP文件。此PHP文件返回一个JSONArray,其中包含JSONObjects作为其元素,例如

[ 
  {
    "uniqid":"h5Wtd", 
    "name":"Test_1", 
    "address":"tst", 
    "email":"ru_tst@tst.cc", 
    "mobile":"12345",
    "city":"ind"
  },
  {...},
  {...},
  ...
]

我的代码:

/* jArrayFavFans is the JSONArray i build from string i get from response.
   its giving me correct JSONArray */
JSONArray jArrayFavFans=new JSONArray(serverRespons);
for (int j = 0; j < jArrayFavFans.length(); j++) {
  try {
    if (jArrayFavFans.getJSONObject(j).getString("uniqid").equals(id_fav_remov)) {
      //jArrayFavFans.getJSONObject(j).remove(j); //$ I try this to remove element at the current index... But remove doesn't work here ???? $
      //int index=jArrayFavFans.getInt(j);
      Toast.makeText(getParent(), "Object to remove...!" + id_fav_remov, Toast.LENGTH_SHORT).show();
    }
  } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}

如何从此JSONArray中删除特定元素?

10 个答案:

答案 0 :(得分:40)

试试此代码

ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
int len = jsonArray.length();
if (jsonArray != null) { 
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
}
//Remove the element from arraylist
list.remove(position);
//Recreate JSON Array
JSONArray jsArray = new JSONArray(list);

修改 使用ArrayList会将"\"添加到键和值中。所以,使用JSONArray本身

JSONArray list = new JSONArray();     
JSONArray jsonArray = new JSONArray(jsonstring); 
int len = jsonArray.length();
if (jsonArray != null) { 
   for (int i=0;i<len;i++)
   { 
       //Excluding the item at position
        if (i != position) 
        {
            list.put(jsonArray.get(i));
        }
   } 
}

答案 1 :(得分:18)

如果有人针对Android平台返回相同的问题,如果您的目标是Android API-18或更低版本,则无法使用内置的remove()方法。在API级别19上添加了remove()方法。因此,最好的做法是扩展JSONArray以为remove()方法创建兼容的覆盖。

public class MJSONArray extends JSONArray {

    @Override
    public Object remove(int index) {

        JSONArray output = new JSONArray();     
        int len = this.length(); 
        for (int i = 0; i < len; i++)   {
            if (i != index) {
                try {
                    output.put(this.get(i));
                } catch (JSONException e) {
                    throw new RuntimeException(e);
                }
            }
        } 
        return output;
        //return this; If you need the input array in case of a failed attempt to remove an item.
     }
}

修改 正如丹尼尔指出的那样,默默地处理错误是一种糟糕的风格。代码改进了。

答案 2 :(得分:3)

public static JSONArray RemoveJSONArray( JSONArray jarray,int pos) {

JSONArray Njarray=new JSONArray();
try{
for(int i=0;i<jarray.length();i++){     
    if(i!=pos)
        Njarray.put(jarray.get(i));     
}
}catch (Exception e){e.printStackTrace();}
return Njarray;

}

答案 3 :(得分:1)

我猜你正在使用我的版本,我建议在你的代码中手动添加这个功能块(JSONArray.java):

public Object remove(int index) {
    Object o = this.opt(index);
    this.myArrayList.removeElementAt(index);
    return o;
}

在java版本中,他们使用ArrayList,在ME版本中他们使用Vector。

答案 4 :(得分:1)

 JSONArray jArray = new JSONArray();

    jArray.remove(position); // For remove JSONArrayElement

注意: - 如果remove()中没有JSONArray那么......

来自Android(4.4)的API 19实际上允许这种方法。

调用需要API级别19(当前最小值为16):org.json.JSONArray #remove

项目上的

右键单击转到属性

从左侧网站选项中选择Android

选择项目构建目标大于API 19

希望它对你有所帮助。

答案 5 :(得分:1)

您可以使用反射

中文网站提供相关解决方案:http://blog.csdn.net/peihang1354092549/article/details/41957369
如果您不懂中文,请尝试使用翻译软件阅读。

他为旧版本提供此代码:

SimpleDateFormat date_0 = new SimpleDateFormat("yyMMdd");
Date date_1 = new Date();
date_1.setDate(date_1.getDay()-1);
long date_t = Long.valueOf(date_0.format(date_1));

答案 6 :(得分:1)

在我的情况下,我想删除状态为非零值的jsonobject,所以我做了一个函数&#34; removeJsonObject&#34;它接受旧的json并提供所需的json并在constuctor中调用该函数。

public CommonAdapter(Context context, JSONObject json, String type) {
        this.context=context;
        this.json= removeJsonObject(json);
        this.type=type;
        Log.d("CA:", "type:"+type);

    }

public JSONObject removeJsonObject(JSONObject jo){
        JSONArray ja= null;
        JSONArray jsonArray= new JSONArray();
        JSONObject jsonObject1=new JSONObject();

        try {
            ja = jo.getJSONArray("data");

        } catch (JSONException e) {
            e.printStackTrace();
        }
        for(int i=0; i<ja.length(); i++){
            try {

                if(Integer.parseInt(ja.getJSONObject(i).getString("status"))==0)
                {
                    jsonArray.put(ja.getJSONObject(i));
                    Log.d("jsonarray:", jsonArray.toString());
                }


            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        try {
            jsonObject1.put("data",jsonArray);
            Log.d("jsonobject1:", jsonObject1.toString());

            return jsonObject1;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return json;
    }

答案 7 :(得分:0)

要从android中的Listview中删除某些元素,则它将删除您的特定元素并将其绑定到Listview。

BookinhHistory_adapter.this.productPojoList.remove(position);

BookinhHistory_adapter.this.notifyDataSetChanged();

答案 8 :(得分:0)

We can use iterator to filter out the array entries instead of creating a new  Array. 

'public static void removeNullsFrom(JSONArray array) throws JSONException {
                if (array != null) {
                    Iterator<Object> iterator = array.iterator();
                    while (iterator.hasNext()) {
                        Object o = iterator.next();
                        if (o == null || o == JSONObject.NULL) {
                            iterator.remove();
                        }
                    }
                }
            }'

答案 9 :(得分:0)

static JSONArray removeFromJsonArray(JSONArray jsonArray, int removeIndex){
    JSONArray _return = new JSONArray();
    for (int i = 0; i <jsonArray.length(); i++) {
        if (i != removeIndex){
            try {
                _return.put(jsonArray.getJSONObject(i));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
    return _return;
}