2010-09-03 1 views
13

Ich begann mit dem Erstellen einer Android-App, die eine Flat-Datei zum Speichern verwendet. Die App speichert nicht mehr als sechs Datensätze, und ich bin mit JSON vertraut, daher schreibe ich einfach einen JSONArray in die Datei.Warum gibt es im Android JSONArray keine Methode zum Entfernen (Int-Position)?

Ich habe gerade heute entdeckt, dass die Android JSON API keine remove() Option enthält. Hä? Muss ich das Array in eine andere Sammlung ablegen, es entfernen und dann die JSONArray neu erstellen? Was ist der Punkt?

+2

Stackoverflow ist für die Programmierung von Fragen und Antworten. Beschwerden bezüglich der JSON-API sollten an die Autoren gerichtet werden, die sich auf json.org befinden. Oder, da es Open Source ist, können Sie es gerne modifizieren und die modifizierte Version selbst verwenden. – CommonsWare

+3

Eigentlich ist dies ein Android SDK-Problem. Behalten Sie das Problem im Auge, um jemanden zum Patchen zu bewegen: https://code.google.com/p/android/issues/detail?id=53461 – Mark

Antwort

6

Der Punkt ist, dass JSONArray und JSONObject Daten in JSON serialisieren, Daten nicht manipulieren sollen. Eine remove() Methode scheint sinnvoll zu sein, aber wo ist das Limit? Würden Sie erwarten, auf Attribute serialisierter Objekte zugreifen zu können? Auf verschachtelte Datenstrukturen zugreifen oder diese aktualisieren?

Die Idee ist in der Tat, dass Sie Datenstrukturen "nativ" manipulieren.

+0

Dies ist sinnvoll. In meinem Fall habe ich einen Datenspeicher, der aus einem einfachen Datenobjekt (POJO, Bean, wie auch immer Sie es nennen wollen) und Liste besteht. Ich sollte mit diesen Objekten direkt umgehen und dann ihren Status über JSON schreiben. – alalonde

+1

Sie haben eine öffentliche API, Sie können nicht einfach Funktionen aus dem Programm entfernen, nur weil Sie denken, dass Ihre Art zu schreiben besser ist. – Mark

+3

Ich denke, dass die org.json API vor über 15 Jahren gemacht wurde. Warum nicht zulassen, dass Personen ein JSONObject-Array neu ordnen, das aus dem Internet geholt wurde? Warum muss eine Liste erstellt werden, anstatt das JSONArray direkt neu zu sortieren? Schleifen von Schleifen, nur um das Gleiche zu tun. –

19

Dies ist manchmal nützlich in Android, wenn Sie die JSON-Struktur direkt verwenden möchten, ohne um zu konvertieren. Bitte verwenden Sie dies nur, wenn Sie beispielsweise eine Zeile mit langen Klicks oder ähnlichem entfernen. Benutze das nicht in einer Schleife!

Beachten Sie, dass ich das nur verwende, wenn ich JSONObject innerhalb des Arrays handhabe.

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

Funktioniert wie ein Charme. – Ceetn

+1

Vielen Dank für den Code. – Magicode

7

Sie möchten es jetzt überprüfen. Scheint wie API 19 von Android (4.4) erlaubt diese Methode tatsächlich.

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

Ich habe diesen Fehler beim Versuch, es zu verwenden. Hoffe es hilft dir jetzt, wo es da ist!

10

Ich benutze:

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

Diese Lösung funktioniert gut für mich, wenn Sie eine Zeile auf API <19 entfernen müssen –

Verwandte Themen