2013-03-14 8 views
11

Chcę konwertować HashMap do json array mój kod jest następująca:Jak przekonwertować HashMap na json Array w systemie Android?

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

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

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

Próbowałem tego, ale to nie działa. Jakieś rozwiązanie?

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

Tak, masz * Mapa *, ale chcą an * Array *? Cóż, najpierw wykonaj tę konwersję, * niezależnie od JSON *, a następnie podaj wynik (który jest teraz listą/tablicą) do odpowiedniego konwertera JSON. Opublikowany kod nie będzie działał - i spowoduje błąd kompilatora, który powinien zostać zawarty w poście - ponieważ nie ma tam 'Arrays.asList (Map )', ponieważ to nie ma sensu, ponieważ nie ma uniwersalnego konwersja (chociaż, być może, chcesz listę wpisów?). Oznacza to, że to pytanie/problem nie ma bezpośredniego związku z JSON. –

+0

@pst: dziękuję, ale jest na to jakieś rozwiązanie? utworzyć tablicę z wartością key => i przekonwertować ją na json? w działaniu androida – Sandeep

+0

Tablice * nie mają * "klucz => wartość". Podaj przykładowe dane mapy i oczekiwane wyjście JSON Array. –

Odpowiedz

34

Spróbuj tego,

public JSONObject (Map copyFrom) 

Tworzy nowy JSONObject kopiując wszystkie mapowania nazwa/wartość z danej mapie.

Parametry copyZ mapy, której klucze są typu String i których wartości są obsługiwanych typów.

Zgłasza Wyjątek NullPointerException, jeśli którykolwiek z kluczy mapy ma wartość NULL.

Podstawowe użycie:

JSONObject obj=new JSONObject(yourmap); 

dostać tablicy json z JSONObject

Edit:

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

Edit: (Jeśli znaleziono wyjątek to można zmienić jak wspomnieć w komentarzu @ krb686)

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

Próbowałem, ale nie działa.Możesz proszę wkleić kod tutaj? – Sandeep

+0

@ pst jest teraz ok – Pragnani

+0

@Sandeep Mam zaktualizowany czek raz – Pragnani

1

Można użyć

JSONArray jarray = JSONArray.fromObject(map);

+0

Dziękuję za odpowiedź, ale nadal nie działa. :( – Sandeep

+0

spróbuj tego: http://stackoverflow.com/questions/9210273/how-to-create-a-complex-json-using-hashmap-in-android – Forhad

+0

Te zajęcia są dostępne w ** JSON-Lib ** biblioteka Możesz znaleźć tę bibliotekę tutaj: http://json-lib.sourceforge.net/ –

2

Mapa składa się z par klucz/wartość, tj. Dwóch obiektów dla każdego wpisu, natomiast lista zawiera tylko jeden obiekt dla każdego wpisu. Co można zrobić, to wydobyć wszystko Map.Entry<K,V> a następnie umieścić je w tablicy:

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

Alternatywnie, czasami warto wyodrębnić klucze lub wartości do kolekcji:

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

lub

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

Uwaga: Jeśli zdecydujesz się wykorzystać klucze jak wpisy, t Zamówienie nie jest gwarantowane (metoda zwraca wartość Set). Dzieje się tak dlatego, że interfejs Map nie określa żadnej kolejności (chyba że Map ma postać SortedMap).

0

To jest najprostsza metoda.

Wystarczy użyć

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

Od androiad API Lvl 19, można po prostu zrobić new JSONObject(new HashMap()). Ale na starszych lvlach API dostajesz brzydki wynik (proste zastosowanie doString do każdej wartości nie-prymitywnej).

Zebrałem metody z JSONObject i JSONArray dla uproszczenia i pięknego wyniku. Można użyć moją klasę rozwiązanie:

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

Następnie, jeśli stosuje mapToJson() metoda do mapy, można uzyskać wynik tak:

{ 
    "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łodkie! Chciałbym dać to +10! Będę musiał spojrzeć na kod źródłowy dla API 19, aby zobaczyć, czy to właśnie robią. Dzięki! – bstar55

+0

Gdyby ten sam problem z nieodnotowalnym łańcuchem był wysyłany w następujący sposób: {klucz = wartość, klucz2 = wartość2} –

+0

+10, zapisz mój dzień. wielkie dzięki – Vrajesh

Powiązane problemy