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

Java 如何从Json数组中删除空对象,java,android,json,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=aHR0cHM6Ly

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()+"");

                        }
                    }

需要帮助

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

  • “stores”
    的JSON结构是异构的-有些元素具有映射到数组的键,有些元素映射到对象。这是您看到的错误的直接原因。您可以修改JSON,使所有键都映射到一个对象,也可以防御性地映射代码
  • 删除条目时,所有后续条目都会向上移动一个空格,但由于随后增加了循环索引
    i
    ,因此会跳过刚刚移动到刚删除的索引中的条目。处理这个问题最简单的方法是以相反的顺序迭代
    store\u array
  • 将这一切放在一起(假设您不打算更改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);
        }
    }
    

    “但那不起作用。”——那是什么意思?它会崩溃吗?产生错误的结果?请提供您期望的和实际发生的详细信息。@TedHopp编辑时出现错误。。为什么要删除这些值?嗯,您有一个异构结构。键
    “amazon”
    “snapdeal”
    的值为空数组,而
    “flipkart”
    的值为对象。您必须修改JSON使其具有同质性(例如,所有键都映射到对象),或者修改代码以处理每个键可能映射到数组或对象的可能性。尝试在recyclerview@DiegoveLopert中显示可用存储非常感谢您的回答。我被困在这个问题从2小时。从未在我的任何作品中使用过instanceOf(noob)。所以我从来没有想到过这件事。再次感谢你。。。。
    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);
        }
    }