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

Posted

技术标签:

【中文标题】如何从 JSONArray 中删除特定元素?【英文标题】:How do I remove a specific element from a JSONArray? 【发布时间】:2012-02-07 21:13:38 【问题描述】:

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

[ 
  
    "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 中删除特定元素?

【问题讨论】:

【参考方案1】:

试试这个代码

ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 

if (jsonArray != null)  
   int len = jsonArray.length();
   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));
        
    

【讨论】:

if (jsonArray != null) 在您的编辑示例中没有意义,因为它永远不会为空。即使会,它前面的行也会抛出 NullPointerException。原始样本也是如此。【参考方案2】:

如果有人返回有关 android 平台的相同问题,如果您的目标是 Android API-18 或更低版本,则不能使用内置的 remove() 方法。 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.
     

编辑 正如 Daniel 指出的那样,默默地处理错误是一种不好的风格。代码改进。

【讨论】:

这是不好的编码风格。如果发生错误,元素不会被删除,但调用代码没有机会知道这一点。更好的方法是使用try..catch,而是在函数头中使用throws JSONException @DanielAlder remove 方法不能抛出异常,因为被覆盖的方法不这样做。 好的,在这种情况下,我会放一个throw new RuntimeException(e)(或InternalError)而不是e.printStackTrace();return this;——只是为了案例 不建议扩展默认类。最好在您使用它的类中创建remove() 方法。【参考方案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;


【讨论】:

【参考方案4】:
 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 的 Project Build Target

希望对你有帮助。

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

你可以使用反射

一个中文网站提供了相关的解决方案: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);

【讨论】:

【参考方案7】:

在我的情况下,我想删除状态为非零值的 jsonobject,所以我做了一个函数“removeJsonObject”,它采用旧 json 并提供所需的 json,并在构造函数中调用该函数。

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;
    

【讨论】:

【参考方案8】:

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

BookinhHistory_adapter.this.productPojoList.remove(position);

BookinhHistory_adapter.this.notifyDataSetChanged();

【讨论】:

【参考方案9】:
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();
                        
                    
                
            '

【讨论】:

欢迎来到 ***!请务必在您的答案中添加解释,以帮助其他人理解 希望它能解决问题,但请添加对代码的解释,以便用户完全理解他/她真正想要的。【参考方案10】:
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;

【讨论】:

以上是关于如何从 JSONArray 中删除特定元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何从字典中删除特定元素? [复制]

PHP:如何从数组中删除特定元素?

如何使用python从数组中删除特定元素

如何在javascript中清除jsonArray [重复]

如何从 numpy nd 数组中删除特定元素?

如何从列表中删除一个特定元素[重复]