web-dev-qa-db-ja.com

JSONArrayから特定の要素を削除するにはどうすればよいですか?

サーバーからPHPファイルを要求する1つのアプリを作成しています。このPHPファイルは、要素としてJSONObjectsを持つJSONArrayを返します。

[ 
  {
    "uniqid":"h5Wtd", 
    "name":"Test_1", 
    "address":"tst", 
    "email":"[email protected]", 
    "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から特定の要素を削除するにはどうすればよいですか?

29
Rupesh Yadav

このコードを試してください

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));
        }
   } 
}

Androidプラットフォームについて同じ質問で誰かが戻ってきた場合、Androidをターゲットにしている場合、組み込みのremove()メソッドを使用できませんAPI-18以下:remove()メソッドはAPIレベル19に追加されます。したがって、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.
     }
}

[〜#〜] edit [〜#〜]ダニエルが指摘したように、エラーを静かに処理するのは悪いスタイルです。コードが改善されました。

18
Subin Sebastian
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
Fabio Guerra
_ 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よりも大きいプロジェクトビルドターゲットを選択します

お役に立てば幸いです。

2
Mansukh Ahir

リフレクションを使用できます

中国のWebサイトは、関連するソリューションを提供しています。 http://blog.csdn.net/peihang1354092549/article/details/41957369
中国語がわからない場合は、翻訳ソフトウェアで中国語を読んでみてください。

彼は古いバージョンのためにこのコードを提供します:

public void JSONArray_remove(int index, JSONArray JSONArrayObject) throws Exception{
    if(index < 0)
        return;
    Field valuesField=JSONArray.class.getDeclaredField("values");
    valuesField.setAccessible(true);
    List<Object> values=(List<Object>)valuesField.get(JSONArrayObject);
    if(index >= values.size())
        return;
    values.remove(index);
}
1
QIQI

私はあなたがMeバージョンを使用していると思う、私はあなたのコード(JSONArray.Java)にこの機能ブロックを手動で追加することを提案する:

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

JavaバージョンではArrayListを使用し、MEバージョンではVectorを使用します。

1
HappyBoyz

私の場合、ステータスがゼロ以外の値のjsonobjectを削除したかったので、古いjsonを取得し、必要なjsonを提供する関数「removeJsonObject」を作成し、コンストラクター内でその関数を呼び出しました。

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;
    }
1
Rajat Chhajed