java - example - mapstruct gradle
Lista<Map<String, Object>> a org.json.JSONObject? (8)
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();
}
¿Qué pasa con este código?
El resultado es:
{"empty": false}
Debe terminar con un JSONArray (correspondiente a la Lista) de JSONObjects (el Mapa).
Intenta declarar la variable json como JSONArray en lugar de JSONObject (creo que el constructor JSONArray hará lo correcto).
Además: podría considerar usar uno de los otros analizadores de la lista de json.org: la mayoría de ellos permiten que sus "objetos" y "arreglos" de Json se mapeen de forma nativa a java.util.Maps y java.util.Lists; o en algunos casos también a objetos reales de Java.
Mi recomendación sería Jackson, http://jackson.codehaus.org/Tutorial , que permite mapear a List / Map / Integer / String / Boolean / null, así como a Beans / POJOs reales. Simplemente dele el tipo y le asigna datos, o escribe objetos Java como Json. Otros como "json-tools" de berlios o google-gson también exponen una funcionalidad similar.
Esto funcionó para mí:
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();
}
Tienes un mapa anidado dentro de una lista. está intentando llamar al Mapa sin repetir primero la lista. JSON a veces se siente como magia, pero de hecho no lo es. Voy a publicar un código en un momento.
Sería más consistente con JSON hacer un Mapa de Mapas en lugar de una Lista de Mapas.
JSONObject json = new JSONObject(list);
Iterator<?> it = json.keys();
while (keyed.hasNext()) {
String x = (String) it.next();
JSONObject jo2 = new JSONObject(jo.optString(x));
}
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();
}
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();
}
bien, prueba esto ~ Esto funcionó para mí: D
Puedes hacerlo usando ambos:
JSONArray
directamente como,
String toJson(Collection<Map<String, Object>> list)
{
return new JSONArray(list).toString();
}
O al iterar la lista con Java8 (como la solución @ShadowJohn):
String toJson(Collection<Map<String, Object>> list)
{
return new JSONArray(
list.stream()
.map((map) -> new JSONObject(map))
.collect(Collectors.toList()))
.toString();
}
Si está utilizando 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);