如何从Json数组中删除空对象

时间:2017-11-20 17:49:32

标签: java android json

所以json就是这样的,

"stores": [
{
"amazon": []
},
{
"flipkart": {
"product_store": "Flipkart",
"product_store_logo": "http://images-api.datayuge.in/image/ZmxpcGthcnRfc3RvcmUucG5n.png",
"product_store_url": "https://price-api.datayuge.com/redirect?id=aHR0cHM6Ly9kbC5mbGlwa2FydC5jb20vZGwvbWktYTEtYmxhY2stNjQtZ2IvcC9pdG1leDl3eHh6M2FtamF0P3BpZD1NT0JFWDlXWFVTWlZZSEVUJmFmZmlkPWFydW5iYWJ1bA",
"product_price": "14999",
"product_offer": "",
"product_color": "",
"product_delivery": "3-4",
"product_delivery_cost": "0",
"is_emi": "1",
"is_cod": "1",
"return_time": "10 Days"
}
},
{
"snapdeal": []
}
]

因此像flipkart这样的非空对象是JsonObject,但所有其他空对象都是数组。所以我对如何删除它们感到困惑。

JSONArray store_array = product_details_json.getJSONObject("data").getJSONArray("stores");
                    for (int i = 0; i<store_array.length(); i++){
                        JSONObject store = store_array.getJSONObject(i);

                        if (!store.getJSONObject(store.keys().next()).has("product_store")){
                            store_array.remove(i);
                        }else {
                            Log.i("Size :",store_array.length()+"");

                        }
                    }

但那不起作用。我知道我这样做是错的。因为它有数组和对象所以我得到以下错误

Value [] at amazon of type org.json.JSONArray cannot be converted to JSONObject

需要帮助!

1 个答案:

答案 0 :(得分:1)

我发现您的代码有两个问题:

  1. "stores"的JSON结构是异构的 - 有些元素有一个映射到数组的键,一些映射到一个对象。这就是您所看到的错误的直接原因。您可以修改您的JSON,以便所有键都可以防御地映射到对象或代码。
  2. 当您删除一个条目时,所有后续条目都向上移动一个空格,但由于您随后增加了循环索引i,因此您跳过刚刚移入您刚删除的索引的条目。解决这个问题的最简单方法是以相反的顺序迭代store_array
  3. 将这些全部放在一起(并假设您不会改变您的JSON结构),类似以下内容(未经测试)应该有效:

    JSONArray store_array = product_details_json.getJSONObject("data").getJSONArray("stores");
    
    for (int i = store_array.length() - 1; i >= 0; i--){
        JSONObject store = store_array.getJSONObject(i);
        Object storeData = store.get(store.keys().next());
        boolean isValidStore = storeData instanceof JSONObject
                && ((JSONObject) storeData).has("product_store");
        if (!isValidStore) {
            store_array.remove(i);
        }
    }