Convierta una cadena JSON en una salida JSON de Pretty Print usando Jackson

Resuelto arsenal asked hace 11 años • 11 respuestas

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 Stringen 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?

arsenal avatar Jan 25 '13 12:01 arsenal
Aceptado

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.

JsonNodeO también puedes usar (árbol JSON).

StaxMan avatar Jan 26 '2013 00:01 StaxMan

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)
Marcelo C. avatar Jun 01 '2014 17:06 Marcelo C.