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 based on my example above? How to achieve this scenario? I know there are lot of examples, 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 fetchAttributesn java.util.concurrent.CancellationExceptionntat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)ntat 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 fetchAttributesn java.util.concurrent.CancellationExceptionntat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)ntat 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 happened this way?
Advertisement
Answer
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.