views:

4752

answers:

5
    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();
    }

What's wrong with this code?

The output is:

{"empty": false}
A: 

you have a map nested inside a list. you are trying to call the Map without ever iterating through the list first. JSON sometimes feels like magic but in fact it is not. I'll post some code in a moment.
It would be more consistent with json to make a Map of Maps instead of a List of Maps.

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

You need to end up with a JSONArray (corresponding to the List) of JSONObjects (the Map).

Try declaring the json variable as a JSONArray instead of a JSONObject (I believe the JSONArray constructor will do the right thing).

gavinandresen
What about the case where there is a JavaBean, which contains a collection that contains Map elements, and I would like to new JSONObject(myJavaBean)? I tried and wasn't satisfied.
yogman
A: 

Also: you could consider using one of other parsers from json.org's list: most of them allow your Json "objects" and "arrays" to map natively to java.util.Maps and java.util.Lists; or in some cases to real Java objects too.

My recommendation would be Jackson, http://jackson.codehaus.org/Tutorial which allows for mapping to List/Map/Integer/String/Boolean/null, as well as to real Beans/POJOs. Just give it the type and it maps data to you, or writes Java objects as Json. Others like "json-tools" from berlios, or google-gson also expose similar functionality.

StaxMan
A: 

This worked for me:

List jsonCategories = new ArrayList();

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

Jose
A: 

List> list = new ArrayList>();
Map map = new HashMap();

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();
}
sivanza