Esta es la cadena JSON que tengo:
{"attributes":[{"nm":"ACCOUNT","lv":[{"v":{"Id":null,"State":null},"vt":"java.util.Map","cn":1}],"vt":"java.util.Map","status":"SUCCESS","lmd":13585},{"nm":"PROFILE","lv":[{"v":{"Party":null,"Ads":null},"vt":"java.util.Map","cn":2}],"vt":"java.util.Map","status":"SUCCESS","lmd":41962}]}
Necesito convertir el JSON anterior String
en Salida JSON de Pretty Print (usando Jackson), como a continuación:
{
"attributes": [
{
"nm": "ACCOUNT",
"lv": [
{
"v": {
"Id": null,
"State": null
},
"vt": "java.util.Map",
"cn": 1
}
],
"vt": "java.util.Map",
"status": "SUCCESS",
"lmd": 13585
},
{
"nm": "PROFILE
"lv": [
{
"v": {
"Party": null,
"Ads": null
},
"vt": "java.util.Map",
"cn": 2
}
],
"vt": "java.util.Map",
"status": "SUCCESS",
"lmd": 41962
}
]
}
¿Alguien puede proporcionarme un ejemplo basado en mi ejemplo anterior? ¿Cómo lograr este escenario? Sé que hay muchos ejemplos, pero no puedo entenderlos correctamente. Cualquier ayuda será apreciada con un simple ejemplo.
Actualizado:
A continuación se muestra el código que estoy usando:
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonString));
Pero esto no funciona de la manera que necesitaba la salida como se mencionó anteriormente.
Aquí está el POJO que estoy usando para el JSON anterior:
public class UrlInfo implements Serializable {
private List<Attributes> attribute;
}
class Attributes {
private String nm;
private List<ValueList> lv;
private String vt;
private String status;
private String lmd;
}
class ValueList {
private String vt;
private String cn;
private List<String> v;
}
¿Alguien puede decirme si obtuve el POJO correcto para el JSON o no?
Actualizado:
String result = restTemplate.getForObject(url.toString(), String.class);
ObjectMapper mapper = new ObjectMapper();
Object json = mapper.readValue(result, Object.class);
String indented = mapper.defaultPrettyPrintingWriter().writeValueAsString(json);
System.out.println(indented);//This print statement show correct way I need
model.addAttribute("response", (indented));
La siguiente línea imprime algo como esto:
System.out.println(indented);
{
"attributes" : [ {
"nm" : "ACCOUNT",
"error" : "null SYS00019CancellationException in CoreImpl fetchAttributes\n java.util.concurrent.CancellationException\n\tat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)\n\tat java.util.concurrent.FutureTask.",
"status" : "ERROR"
} ]
}
así es como necesitaba que me mostraran. Pero cuando lo agrego al modelo así:
model.addAttribute("response", (indented));
Y luego lo muestra en una página jsp de formulario de resultados como a continuación:
<fieldset>
<legend>Response:</legend>
<strong>${response}</strong><br />
</fieldset>
Me sale algo como esto:
{ "attributes" : [ { "nm" : "ACCOUNT", "error" : "null
SYS00019CancellationException in CoreImpl fetchAttributes\n
java.util.concurrent.CancellationException\n\tat
java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)\n\tat
java.util.concurrent.FutureTask.", "status" : "ERROR" } ] }
que no necesito Necesitaba la forma en que se imprimió arriba. ¿Alguien puede decirme por qué sucedió de esta manera?
fuente
La solución más simple y también más compacta (para v2.3.3):
fuente
La nueva forma de usar Jackson 1.9+ es la siguiente:
¡La salida se formateará correctamente!
fuente
Para Jackson 1.9, podemos usar el siguiente código para una bonita impresión.
fuente
Creo que esta es la técnica más simple para embellecer los datos json,
donde Response es una cadena.
Simplemente pase el 4 (indentSpaces) en el
toString()
método.Nota: Funciona bien en Android sin ninguna biblioteca. Pero en Java tienes que usar la biblioteca org.json .
fuente
String json = new GsonBuilder().setPrettyPrinting().create().toJson(map); String indentedJson = (new JSONObject(json)).toString(4);
por alguna razón, el segundo está perdiendo el orden de las llavesParece que podría ser la respuesta a tu pregunta . Dice que está usando Spring, pero creo que eso debería ayudarte en tu caso. Permítanme incluir el código aquí para que sea más conveniente:
fuente
Puede lograr esto de la siguiente manera:
1. Usando Jackson de Apache
Importar clase abajo:
Su dependencia de Gradle es:
2. Usando Gson de Google
Importar clase abajo:
Es gradle es:
Aquí, puede descargar la versión actualizada correcta del repositorio.
fuente
ObjectMapper.readTree()
puede hacer esto en una línea:fuente