Convierta una cadena JSON en una salida JSON de Pretty Print usando Jackson
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 una salida JSON de Pretty Print (usando Jackson), como se muestra 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 darme un ejemplo basado en el ejemplo anterior? ¿Cómo lograr este escenario? Sé que hay muchos ejemplos, pero no puedo entenderlos correctamente. Cualquier ayuda será apreciada con un ejemplo sencillo.
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 con la forma en que necesitaba el resultado 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 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"
} ]
}
que es la forma en que necesitaba que me mostraran. Pero cuando lo agrego a un modelo como este:
model.addAttribute("response", (indented));
Y luego lo muestra en una página jsp de formulario de resultados como la siguiente:
<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?
Para sangrar cualquier JSON antiguo, simplemente vincúlelo como Object
, como:
Object json = mapper.readValue(input, Object.class);
y luego escríbalo con sangría:
String indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);
esto evita tener que definir POJO real para asignar datos.
JsonNode
O también puedes usar (árbol JSON).
La solución más simple y también la más compacta (para v2.3.3):
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.writeValueAsString(obj)