2009-02-04 27 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(); 
} 

Was ist falsch an diesem Code?Liste <Map <String, Object >> zu org.json.JSONObject?

Die Ausgabe lautet:

{"empty": false} 

Antwort

1

Sie haben eine Karte in einer Liste verschachtelt. Sie versuchen, die Map aufzurufen, ohne die Liste zuerst zu durchlaufen. JSON fühlt sich manchmal wie Magie an, ist es aber tatsächlich nicht. Ich poste einen Code in einem Moment.
Es wäre konsistenter mit JSON, eine Karte von Karten statt einer Liste von Karten zu erstellen.

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

Sie müssen mit einem JSONArray (entsprechend der Liste) von JSONObjects (die Karte) enden.

Versuchen Sie, die JSON-Variable als JSONArray anstelle von JSONObject zu deklarieren (ich glaube, der JSONArray-Konstruktor wird das Richtige tun).

+0

Was ist mit dem Fall, wo es eine JavaBean gibt, die eine Sammlung enthält, die Map-Elemente enthält, und ich möchte neue JSONObject (myJavaBean)? Ich habe es versucht und war nicht zufrieden. – yogman

1

Auch: Sie könnten einen der anderen Parser aus der Liste von json.org in Erwägung ziehen: die meisten erlauben Ihren Json "objects" und "arrays", nativ java.util.Maps und java.util.Lists zuzuordnen; oder in einigen Fällen auch auf echte Java-Objekte.

Meine Empfehlung wäre Jackson, http://jackson.codehaus.org/Tutorial , die Zuordnung zu List/Map/Integer/String/Boolean/null, sowie zu echten Bohnen/POJOs ermöglicht. Gib ihm einfach den Typ und er mappt dir Daten oder schreibt Java-Objekte als Json. Andere wie "json-tools" von berlios oder google-gson stellen ebenfalls ähnliche Funktionen zur Verfügung.

1

Das ist für mich gearbeitet:

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

Bitte schreiben Sie einen Kommentar in Ihren Code. – 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(); 
} 

in Ordnung, dies versuchen ~ Das ist für mich gearbeitet: D

+2

Es ist '12 und ich schaue mir die Antwort an :) Ich bin dabei, etwas sehr ähnliches zu machen (insbesondere eine ArrayList von HashMaps) und das hilft erheblich. –

0

Sie können es beide tun mit:

JSONArray direkt wie,

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

Oder durch die Liste mit Java8 (wie @ShadowJohn Lösung) Iterieren:

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