web-dev-qa-db-fra.com

Comment supprimer un élément spécifique d'un tableau JSONArray?

Je crée une application dans laquelle je demande un fichier PHP au serveur. Ce fichier PHP renvoie un JSONArray ayant JSONObjects comme éléments, par exemple,

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

mon code:

/* 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();
  }
}

Comment supprimer un élément spécifique de ce tableau JSONArray?

29
Rupesh Yadav

Essayez ce code

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

Edit: L'utilisation de ArrayList ajoutera "\" à la clé et aux valeurs. Donc, utilisez JSONArray lui-même

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

Si quelqu'un revient avec la même question pour la plateforme Android, vous ne pouvez pas utiliser la méthode remove() intégrée si vous ciblez Android API-18 ou moins. La méthode remove() est ajoutée au niveau API 19. Ainsi, la meilleure chose à faire est d'étendre JSONArray pour créer un remplacement compatible pour la fonction remove() méthode.

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 Comme Daniel l'a souligné, gérer une erreur en silence est un mauvais style. Code amélioré.

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

Remarque: - Si remove() n'est pas là dans JSONArray alors ...

L'API 19 de Android (4.4) autorise en fait cette méthode.

L'appel nécessite le niveau d'API 19 (la valeur minimale actuelle est de 16): org.json.JSONArray # remove

clic droit sur le projet Aller aux propriétés

Sélectionnez Android dans l'option de site de gauche

Et sélectionnez Project Build Target supérieur à API 19

J'espère que cela vous aide.

2
Mansukh Ahir

Vous pouvez utiliser la réflexion

Un site Web chinois fournit une solution pertinente: http://blog.csdn.net/peihang1354092549/article/details/41957369
Si vous ne comprenez pas le chinois, essayez de le lire avec le logiciel de traduction.

Il fournit ce code pour l'ancienne version:

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

je suppose que vous utilisez la version Me, je suggère d'ajouter ce bloc de fonction manuellement, dans votre code (JSONArray.Java):

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

Dans la version Java, ils utilisent ArrayList, dans la version ME, ils utilisent Vector.

1
HappyBoyz

Dans mon cas, je voulais supprimer jsonobject avec un statut de valeur non nulle, donc ce que j'ai fait est une fonction "removeJsonObject" qui prend l'ancien json et donne le json requis et a appelé cette fonction à l'intérieur du 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;
    }
1
Rajat Chhajed