2010-09-03 13 views
13

Depolama için düz bir dosya kullanan bir Android uygulaması oluşturmaya başladım. Uygulama altıdan fazla kayıt saklamaz ve JSON'a aşina olduğum için dosyaya bir JSONArray yazdım.Neden Android'in JSONArray'ında bir kaldırma (int position) yöntemi yok?

Ancak bugün, Android JSON API'sinin remove() seçeneğini içermediğini keşfettim. Ha? Diziyi başka bir koleksiyona dökmek, kaldırmak ve JSONArray yeniden oluşturmak zorunda mıyım? Amaç ne?

+2

StackOverflow programlama soruları ve cevapları içindir. JSON API ile ilgili şikayetler json.org adresindeki yazarlara yönlendirilmelidir. Ya da, açık kaynak olduğu için, gerçekten değiştirebilir ve değiştirilmiş sürümü kendiniz kullanabilirsiniz. – CommonsWare

+3

Aslında bu bir android SDK sorunudur. Bu sorunu çözmek için bir kişiyi şuraya yönlendirin: https://code.google.com/p/android/issues/detail?id=53461 – Mark

cevap

6

Buradaki nokta, JSONArray ve JSONObject'un verileri, verileri işlemek için değil JSON'a serileştirmesidir (de). Bir remove() yöntemi mantıklı görünebilir, ancak sınır nerede? Seri hale getirilmiş nesnelerdeki özniteliklere erişmeyi bekler miydiniz? Yuvalanmış veri yapılarına erişin veya güncelleyin?

Aslında, veri yapılarını "doğal olarak" değiştirdiğiniz düşüncesidir.

+0

Bu mantıklıdır. Benim durumumda, düz bir veri nesnesinden (POJO, Bean, ne demek istiyorsan söylesin) ve List'ten oluşan bir veri mağazam var. Bu nesnelerle doğrudan ilgilenmeli ve daha sonra devletlerini JSON üzerinden yazmalıyım. – alalonde

+1

Genel bir API'niz var, sadece kodlama yönteminin daha iyi olduğunu düşündüğünüz için işlevleri rastgele silemezsiniz. – Mark

+3

Sanırım org.json API'sı 15 yıl önce yapıldı. İnsanların internetten getirilen bir JSONObject dizisini yeniden sipariş etmelerine neden izin verilmiyor? JSONArray'i doğrudan yeniden düzenlemek yerine neden bir Listeoluşturmak zorunludur? Sadece aynı şeyi yapmak için ilmek döngüleri. –

19

Bu, json yapısını doğrudan kullanmak istediğinizde, çevrimiçine çevirmeden, bazen android olarak yararlıdır. Lütfen bunu yalnızca uzun tıklamalardaki bir satırı veya bunun gibi bir şeyi kaldırmak istediğinizde kullanın. Bunu bir döngü içinde kullanmayın!

Dizide JSONObject ile çalışırken yalnızca bunu kullandığım dikkat edin.

public static JSONArray remove(final int idx, final JSONArray from) { 
    final List<JSONObject> objs = asList(from); 
    objs.remove(idx); 

    final JSONArray ja = new JSONArray(); 
    for (final JSONObject obj : objs) { 
     ja.put(obj); 
    } 

    return ja; 
} 

public static List<JSONObject> asList(final JSONArray ja) { 
    final int len = ja.length(); 
    final ArrayList<JSONObject> result = new ArrayList<JSONObject>(len); 
    for (int i = 0; i < len; i++) { 
     final JSONObject obj = ja.optJSONObject(i); 
     if (obj != null) { 
      result.add(obj); 
     } 
    } 
    return result; 
} 
+1

Bir çekicilik gibi çalışır. – Ceetn

+1

Kod için çok teşekkür ederim. – Magicode

7

Şimdi kontrol etmek isteyebilirsiniz. Android'den API 19 gibi görünüyor (4.4) aslında bu yönteme izin veriyor.

Call requires API level 19 (current min is 16): org.json.JSONArray#remove 

Kullanmaya çalışırken bu hatayı aldım. Umarım size yardımcı olur, şimdi orada!

10

kullandığım:

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; 
} 
+0

API üzerindeki bir satırı kaldırmanız gerektiğinde bu çözüm benim için iyi çalışıyor <19 –

İlgili konular