lining lining - 1 year ago 260
JSON Question

Convert JSON String to Pretty Print JSON output using Jackson

This is the JSON string I have-

{"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}]}


I need to convert the above JSON string into Pretty Print JSON Output(using Jackson) like below-

{
"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
}
]
}


Can anyone provide me an example basis on my example above? How to achieve this scenario, I know there are lot of example but I am not able to understand those properly. Any help will be appreciated with a simple example.

Updated:

Below is the code I am using

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonString));


But this doesn't works with the way I needed the output as mentioned above

Here's is the POJO I am using for the above JSON-

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


Can anyone tell me whether I got the right POJO for the JSON or not?

Updated:-

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


Below line prints out something like this-

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"
} ]
}


which is the way I needed to be shown. But when I add it to model like this-

model.addAttribute("response", (indented));


And then shows it out in a resultform jsp page like below-

<fieldset>
<legend>Response:</legend>
<strong>${response}</strong><br />

</fieldset>


I get something like this-

{ "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" } ] }


which I don't need. I needed the way it got printed out above. Can anyone tell me why it got happened like this?

Answer Source

To indent any old JSON, just bind it as Object, like:

Object json = mapper.readValue(input, Object.class);

and then write it out with indentation:

String indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);

this avoids your having to define actual POJO to map data to.

Or you can use JsonNode (JSON Tree) as well.