2009-02-04 19 views
11
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 
Map<String, Object> map = new HashMap<String, Object>(); 

map.put("abc", "123456"); 
map.put("def", "hmm"); 
list.add(map); 
JSONObject json = new JSONObject(list); 
try { 
    System.err.println(json.toString(2)); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

Co jest nie tak z tym kodem?Lista <mapa <ciąg, obiekt >> do org.json.JSONObject?

Wyjście jest:

{"empty": false} 

Odpowiedz

1

Masz mapę zagnieżdżony wewnątrz listy. próbujesz wywołać mapę bez wcześniejszej iteracji na liście. JSON czasami czuje się jak magia, ale w rzeczywistości tak nie jest. Założę trochę kodu w jednej chwili.
Byłoby bardziej zgodne z JSON, aby utworzyć Mapę Map zamiast Listy map.

JSONObject json = new JSONObject(list); 
Iterator<?> it = json.keys(); 
while (keyed.hasNext()) { 
    String x = (String) it.next(); 
    JSONObject jo2 = new JSONObject(jo.optString(x)); 
} 
2

Musisz skończyć z JSONArray (co odpowiada liście) JSONObjects (the Map).

Spróbuj zadeklarować zmienną json jako JSONArray zamiast JSONObject (Wierzę, że konstruktor JSONArray zrobi to, co trzeba).

+0

Co z przypadkiem, w którym istnieje komponent JavaBean, który zawiera kolekcję zawierającą elementy mapy i chciałbym nowego JSONObject (myJavaBean)? Próbowałem i nie byłem zadowolony. – yogman

1

Także: możesz rozważyć użycie jednego z innych parserów z listy json.org: większość z nich pozwala twoim Jsonowi "obiekty" i "tablice" na mapowanie natywnie do java.util.Maps i java.util.Lists; lub w niektórych przypadkach do rzeczywistych obiektów Java.

Moja rekomendacja byłoby Jackson, http://jackson.codehaus.org/Tutorial który pozwala na mapowanie do listy/mapa/Integer/String/Boolean/null, a także do rzeczywistych Beans/POJOs. Po prostu daj mu typ i mapuje dane do ciebie lub zapisuje obiekty Java jako Json. Inne podobne do "json-tools" z berlios lub google-gson również mają podobne funkcje.

1

Ten pracował dla mnie:

List<JSONObject> jsonCategories = new ArrayList<JSONObject>(); 

JSONObject jsonCategory = null; 

for (ICategory category : categories) { 
    jsonCategory = new JSONObject(); 
    jsonCategory.put("categoryID", category.getCategoryID()); 
    jsonCategory.put("desc", category.getDesc()); 
    jsonCategories.add(jsonCategory); 
} 
try { 
    PrintWriter out = response.getWriter(); 
    response.setContentType("text/xml"); 
    response.setHeader("Cache-Control", "no-cache"); 
    _log.info(jsonCategories.toString()); 
    out.write(jsonCategories.toString()); 

} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
3
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 
Map<String, Object> map = new HashMap<String, Object>(); 

map.put("abc", "123456"); 
map.put("def", "hmm"); 
list.add(map); 
// it's wrong JSONObject json = new JSONObject(list); 
// if u use list to add data u must be use JSONArray 

JSONArray json = JSONArray.fromObject(list); 
try { 
    System.err.println(json.toString(2)); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 
+0

Napisz komentarz do swojego kodu. – CSchulz

19
public String listmap_to_json_string(List<Map<String, Object>> list) 
{  
    JSONArray json_arr=new JSONArray(); 
    for (Map<String, Object> map : list) { 
     JSONObject json_obj=new JSONObject(); 
     for (Map.Entry<String, Object> entry : map.entrySet()) { 
      String key = entry.getKey(); 
      Object value = entry.getValue(); 
      try { 
       json_obj.put(key,value); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }       
     } 
     json_arr.put(json_obj); 
    } 
    return json_arr.toString(); 
} 

porządku, spróbuj tego ~ Ten pracował dla mnie: D

+2

To '12 i patrzę na odpowiedź :) Czekam na zrobienie czegoś bardzo podobnego do tego (szczególnie ArrayList z HashMaps) i to znacznie pomaga. –

0

Można to zrobić przy użyciu zarówno:

JSONArray bezpośrednio as,

String toJson(Collection<Map<String, Object>> list) 
{  
    return new JSONArray(list).toString(); 
} 

Albo przez powtarzanie listy z Java8 (jak rozwiązania @ShadowJohn):

String toJson(Collection<Map<String, Object>> list) 
{  
    return new JSONArray( 
      list.stream() 
       .map((map) -> new JSONObject(map)) 
      .collect(Collectors.toList())) 
     .toString(); 
} 
Powiązane problemy