Convert JSON String to Pretty Print JSON output using Jackson

匿名 (未验证) 提交于 2019-12-03 02:28:01

问题:

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 attribute;  }  class Attributes {      private String nm;     private List lv;     private String vt;     private String status;     private String lmd;  }   class ValueList {     private String vt;     private String cn;     private List 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-

    
Response: ${response}

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?

回答1:

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.



回答2:

The simplest and also the most compact solution (for v2.3.3):

ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); 


回答3:

The new way using Jackson 1.9+ is the following:

Object json = OBJECT_MAPPER.readValue(diffResponseJson, Object.class); String indented = OBJECT_MAPPER.writerWithDefaultPrettyPrinter()                                .writeValueAsString(json); 

The output will be correctly formatted!



回答4:

For Jackson 1.9, We can use the following code for pretty print.

ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT); 


回答5:

I think, this is the simplest technique to beautify the json data,

String indented = (new JSONObject(Response)).toString(4); 

where Response is a String.

Simply pass the 4(indentSpaces) in toString() method.

Note: It works fine in the android without any library. But in java you have to use the org.json library.



回答6:

This looks like it might be the answer to your question. It says it's using Spring, but I think that should still help you in your case. Let me inline the code here so it's more convenient:

import java.io.FileReader;  import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectWriter;  public class Foo {   public static void main(String[] args) throws Exception   {     ObjectMapper mapper = new ObjectMapper();     MyClass myObject = mapper.readValue(new FileReader("input.json"), MyClass.class);     // this is Jackson 1.x API only:      ObjectWriter writer = mapper.defaultPrettyPrintingWriter();     // ***IMPORTANT!!!*** for Jackson 2.x use the line below instead of the one above:      // ObjectWriter writer = mapper.writer().withDefaultPrettyPrinter();     System.out.println(writer.writeValueAsString(myObject));   } }  class MyClass {   String one;   String[] two;   MyOtherClass three;    public String getOne() {return one;}   void setOne(String one) {this.one = one;}   public String[] getTwo() {return two;}   void setTwo(String[] two) {this.two = two;}   public MyOtherClass getThree() {return three;}   void setThree(MyOtherClass three) {this.three = three;} }  class MyOtherClass {   String four;   String[] five;    public String getFour() {return four;}   void setFour(String four) {this.four = four;}   public String[] getFive() {return five;}   void setFive(String[] five) {this.five = five;} } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!