Converter JSON String para saída JSON Pretty Print usando Jackson

Esta é a string JSON que eu tenho

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

Eu preciso converter a string JSON acima em Pretty Print JSON Output (usando Jackson) como abaixo.

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

Alguém pode me fornecer uma base de exemplo no meu exemplo acima? Como alcançar esse cenário, sei que há muitos exemplos, mas não consigo entender os problemas corretamente. Qualquer ajuda será apreciada com um exemplo simples.

Atualizada:

Abaixo está o código que estou usando

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

Mas isso não funciona com a maneira que eu precisava da saída como mencionado acima

Aqui está o POJO que estou usando para o JSON- acima

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

Alguém pode me dizer se eu tenho o POJO certo para o JSON ou não?

Atualizada:-

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

Abaixo da linha imprime algo como isto-

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

qual é a maneira que eu precisava ser mostrado. Mas quando eu adiciono ao modelo como este-

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

E, em seguida, mostra-lo em uma página jsp resultform como abaixo-

  
Response: ${response}

Eu recebo algo parecido com isto

 { "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 eu não preciso. Eu precisava do jeito que foi impresso acima. Alguém pode me dizer por que isso aconteceu assim?

Para recuar qualquer JSON antigo, apenas vincule-o como Object , como:

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

e depois escrevê-lo com recuo:

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

isso evita que você tenha que definir o POJO real para mapear dados para.

Ou você pode usar o JsonNode (JSON Tree) também.

A solução mais simples e também a mais compacta (para v2.3.3):

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

A nova maneira de usar o Jackson 1.9+ é a seguinte:

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

A saída será formatada corretamente!

Para o Jackson 1.9, podemos usar o seguinte código para impressão bonita.

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

Eu acho que esta é a técnica mais simples para embelezar os dados json,

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

em que Response é uma string.

Simplesmente passe o 4 (indentSpaces) no toString() .

Nota: Funciona bem no android sem qualquer biblioteca. Mas no java você tem que usar a biblioteca org.json .

Isso parece ser a resposta para sua pergunta . Ele diz que está usando o Spring, mas acho que isso ainda deve ajudá-lo no seu caso. Deixe-me inserir o código aqui para que seja mais conveniente:

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