web-dev-qa-db-fra.com

Listez <Map <String, Object >> à org.json.JSONObject?

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

Quel est le problème avec ce code?

La sortie est:

{"empty": false}
13
yogman
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();
}

d'accord, essayez ceci ~ Cela a fonctionné pour moi: D

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

Vous devez vous retrouver avec un tableau JSON (correspondant à la liste) de JSONObjects (la carte).

Essayez de déclarer la variable JSON en tant que JSONArray au lieu de JSONObject (je pense que le constructeur JSONArray fera ce qu'il faut).

2
gavinandresen

Si vous utilisez org.json.simple.JSONArray  

( https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple/1.1.1

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

JSONArray jsonArray = new JSONArray();
jsonArray.addAll(listOfMaps);
1
Balaji Dubey

Cela a fonctionné pour moi:

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

De plus, vous pouvez envisager d'utiliser l'un des autres analyseurs de la liste de json.org: la plupart d'entre eux permettent à vos "objets" et "matrices" Json de mapper de manière native vers Java.util.Maps et Java.util.Lists; ou dans certains cas à de vrais objets Java aussi.

Ma recommandation serait Jackson, http://jackson.codehaus.org/Tutorial , Qui permet un mappage vers List/Map/Integer/String/Boolean/null, ainsi que vers de vrais haricots/POJOs. Donnez-lui simplement le type et il mappe les données, ou écrit des objets Java au format Json. D'autres, comme "json-tools" de berlios ou google-gson, offrent également des fonctionnalités similaires.

1
StaxMan

Vous avez une carte imbriquée dans une liste. vous essayez d'appeler la carte sans jamais parcourir d'abord la liste. JSON a parfois l’impression d’être magique, mais ce n’est pas le cas. Je posterai du code dans un instant.
Il serait plus cohérent avec JSON de créer une carte de cartes au lieu d’une liste de cartes.

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

Vous pouvez le faire en utilisant à la fois:

JSONArray directement comme,

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

Ou en itérant la liste avec Java8 (comme la solution @ShadowJohn):

String toJson(Collection<Map<String, Object>> list)
{       
    return new JSONArray( 
            list.stream()
                .map((map) -> new JSONObject(map))
            .collect(Collectors.toList()))
        .toString();
}
0
Flávio Ferreira