2013-03-14 11 views
11

Ich möchte konvertieren HashMap zu json array mein Code wie folgt lautet:Wie konvertiert man HashMap zu json Array in Android?

Map<String, String> map = new HashMap<String, String>(); 

map.put("first", "First Value"); 

map.put("second", "Second Value"); 

Ich habe dies versucht, aber es nicht funktionierte. Irgendeine Lösungsmöglichkeit?

JSONArray mJSONArray = new JSONArray(Arrays.asList(map)); 
+1

So können Sie eine * Karte *, aber wollen eine Anordnung*? Nun, führen Sie diese Konvertierung zuerst durch, * unabhängig von JSON *, und geben Sie dann das Ergebnis (das jetzt eine Liste/Array ist) an den entsprechenden JSON-Konverter. Der gepostete Code wird nicht funktionieren - und wird zu einem Compilerfehler führen, der im Post enthalten sein sollte - weil es keine 'Arrays.asList (Map ) 'gibt, da dies keinen Sinn ergibt, da es kein universal gibt Konvertierung (obwohl, vielleicht möchten Sie eine Liste der Einträge?). Das heißt, diese Frage/dieses Problem hat nichts direkt mit JSON zu tun. –

+0

@pst: danke, aber es gibt eine Lösung? Array mit Schlüssel => Wert zu erstellen und es in Json zu konvertieren? in Android-Aktivität – Sandeep

+0

Arrays * nicht * "key => value". Geben Sie Beispielkartendaten und die erwartete JSON-Array-Ausgabe an. –

Antwort

34

Versuchen Sie, diese verwenden,

public JSONObject (Map copyFrom) 

Erstellt einen neuen JSONObject durch alle Namen/Wert-Zuordnungen aus der angegebenen Karte zu kopieren.

Parameter copyAus einer Map, deren Schlüssel vom Typ String sind und deren Werte von unterstützten Typen sind.

Wirft NullPointerException, wenn einer der Schlüssel der Zuordnung null ist.

Grund Nutzung:

JSONObject obj=new JSONObject(yourmap); 

erhalten die json Array aus der JSONObject

Edit:

JSONArray array=new JSONArray(obj.toString()); 

Edit: (Wenn Exception gefunden, dann können Sie ändern wie erwähnt im Kommentar von @ krb686)

JSONArray array=new JSONArray("["+obj.toString()+"]"); 
+0

Ich habe versucht, aber nicht funktioniert. Könnten Sie bitte Code hier einfügen? – Sandeep

+0

@ PST ist es jetzt ok – Pragnani

+0

@Sandeep Ich habe überprüft einmal überprüfen – Pragnani

1

können Sie

JSONArray jarray = JSONArray.fromObject(map);

+0

Vielen Dank für Ihre Antwort, aber immer noch nicht funktioniert. :( – Sandeep

+0

versuchen Sie dies: http://StackOverflow.com/Questions/9210273/How-to-Create-A-Complex-JSon-Shashmap-in-Android – Forhad

+0

Diese Klassen sind verfügbar in ** JSON-Lib ** Sie können diese Bibliothek hier finden: http://json-lib.sourceforge.net/ –

2

Eine Karte besteht aus Schlüssel/Wert-Paaren, das heißt zwei Objekte für jeden Eintrag, wohingegen eine Liste nur ein einzelnes Objekt für jeden Eintrag aufweist. Was können Sie tun, alle zu extrahieren ist Map.Entry<K,V> und sie dann im Array setzen:

Set<Map.Entry<String, String> entries = map.entrySet(); 
JSONArray mJSONArray = new JSONArray(entries); 

Alternativ ist es manchmal sinnvoll, die Tasten oder die Werte zu einer Sammelstelle zu extrahieren:

Set<String> keys = map.keySet(); 
JSONArray mJSONArray = new JSONArray(keys); 

oder

List<String> values = map.values(); 
JSONArray mJSONArray = new JSONArray(values); 

Hinweis: Wenn Sie die Tasten als Einträge verwenden, t Die Bestellung ist nicht garantiert (die Methode keySet() gibt eine Set zurück). Das liegt daran, dass die Schnittstelle Map keine Reihenfolge angibt (es sei denn, die Map ist zufällig eine SortedMap).

0

Dies ist die einfachste Methode.

Verwenden Sie einfach

JSONArray jarray = new JSONArray(hashmapobject.toString); 
11

Seit androiad API 19 Lvl, können Sie einfach tun new JSONObject(new HashMap()). Aber bei älteren API-Levels erhalten Sie ein hässliches Ergebnis (simple apply toString auf jeden nicht-primitiven Wert).

Ich sammelte Methoden von JSONObject und JSONArray für die Vereinfachung und schön Ergebnis. Sie können meine Lösung Klasse verwenden:

package you.package.name; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.lang.reflect.Array; 
import java.util.Collection; 
import java.util.Map; 

public class JsonUtils 
{ 
    public static JSONObject mapToJson(Map<?, ?> data) 
    { 
     JSONObject object = new JSONObject(); 

     for (Map.Entry<?, ?> entry : data.entrySet()) 
     { 
      /* 
      * Deviate from the original by checking that keys are non-null and 
      * of the proper type. (We still defer validating the values). 
      */ 
      String key = (String) entry.getKey(); 
      if (key == null) 
      { 
       throw new NullPointerException("key == null"); 
      } 
      try 
      { 
       object.put(key, wrap(entry.getValue())); 
      } 
      catch (JSONException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

     return object; 
    } 

    public static JSONArray collectionToJson(Collection data) 
    { 
     JSONArray jsonArray = new JSONArray(); 
     if (data != null) 
     { 
      for (Object aData : data) 
      { 
       jsonArray.put(wrap(aData)); 
      } 
     } 
     return jsonArray; 
    } 

    public static JSONArray arrayToJson(Object data) throws JSONException 
    { 
     if (!data.getClass().isArray()) 
     { 
      throw new JSONException("Not a primitive data: " + data.getClass()); 
     } 
     final int length = Array.getLength(data); 
     JSONArray jsonArray = new JSONArray(); 
     for (int i = 0; i < length; ++i) 
     { 
      jsonArray.put(wrap(Array.get(data, i))); 
     } 

     return jsonArray; 
    } 

    private static Object wrap(Object o) 
    { 
     if (o == null) 
     { 
      return null; 
     } 
     if (o instanceof JSONArray || o instanceof JSONObject) 
     { 
      return o; 
     } 
     try 
     { 
      if (o instanceof Collection) 
      { 
       return collectionToJson((Collection) o); 
      } 
      else if (o.getClass().isArray()) 
      { 
       return arrayToJson(o); 
      } 
      if (o instanceof Map) 
      { 
       return mapToJson((Map) o); 
      } 
      if (o instanceof Boolean || 
        o instanceof Byte || 
        o instanceof Character || 
        o instanceof Double || 
        o instanceof Float || 
        o instanceof Integer || 
        o instanceof Long || 
        o instanceof Short || 
        o instanceof String) 
      { 
       return o; 
      } 
      if (o.getClass().getPackage().getName().startsWith("java.")) 
      { 
       return o.toString(); 
      } 
     } 
     catch (Exception ignored) 
     { 
     } 
     return null; 
    } 
} 

Dann, wenn Sie mapToJson() -Methode, um Ihre Karte anwenden, können Sie wie folgt Ergebnis:

{ 
    "int": 1, 
    "Integer": 2, 
    "String": "a", 
    "int[]": [1,2,3], 
    "Integer[]": [4, 5, 6], 
    "String[]": ["a","b","c"], 
    "Collection": [1,2,"a"], 
    "Map": { 
    "b": "B", 
    "c": "C", 
    "a": "A" 
    } 
} 
+1

Süß! Ich wünschte ich könnte das +10 geben! Ich muss mir den Quellcode für API 19 ansehen, um zu sehen, ob sie das tun. Vielen Dank! – bstar55

+0

Hatte das gleiche Problem mit undecodable Zeichenfolge gesendet werden, wie folgt aussehen: {Schlüssel = Wert, Schlüssel2 = Wert2} –

+0

+10, speichern Sie meinen Tag. Danke vielmals – Vrajesh

Verwandte Themen