2013-01-25 56 views
100

這是JSON字符串我有─轉換JSON字符串到漂亮的打印JSON輸出使用傑克遜

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

我需要上述JSON字符串轉換成漂亮的打印JSON輸出(使用傑克遜)等如下─

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

任何人都可以在我上面的示例中提供示例基礎嗎?如何實現這種情況,我知道有很多例子,但我無法正確理解這些。任何幫助將通過一個簡單的例子來體會。

更新時間:

下面是我使用

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

代碼但是,這並不與我所需要的輸出上面

這裏所提到的工作方式是POJO我用於上述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; 
} 

任何人都可以告訴我是否爲JSON獲得了正確的POJO嗎?

更新: -

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

以下行打印出來的東西像這 -

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

這是我需要的顯示方式。但是,當我把它添加到模型像這個 -

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

,然後顯示出來的resultform jsp頁面類似如下─

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

    </fieldset> 

我得到的東西像這 -

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

我不需要。我需要它打印出來的方式。誰能告訴我爲什麼會發生這樣的事情?

+2

如果您向我們展示您迄今爲止編寫的代碼,那將會很棒。 – Swapnil

+0

@Swapnil,用我到目前爲止的代碼更新了這個問題。 – ferhan

回答

124

縮進任何舊的JSON,只是將其綁定爲Object,如:

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

然後將它與縮進寫出來:

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

這可以避免您必須定義實際的POJO來映射數據。我們也可以使用JsonNode(JSON樹)。

+0

感謝StaxMan,我想這是工作。當我縮小打印時,我會按照我需要的方式進行打印。但是當我使用縮進來添加到模型中,以便我可以在結果頁面中顯示它們。它仍然以兩行三行打印。我已經更新了這個問題,也許你會更清楚現在發生了什麼。 – ferhan

+0

問題出在Spring上 - 我猜它需要POJO作爲屬性,而不是預格式化的String。因此,不要試圖自己設計格式,你需要告訴Spring做這件事。使用傑克遜時,應該可以將其配置爲使用縮進。雖然說實話,我不知道爲什麼你甚至需要縮進來回應。 – StaxMan

+20

嗨,defaultPrettyPrintingWriter()已被棄用。從1.9開始,請使用writerWithDefaultPrettyPrinter()代替。 請參閱:http://jackson.codehaus.org/1.9.0/javadoc/org/codehaus/jackson/map/ObjectMapper.html#defaultPrettyPrintingWriter() –

3

This looks like it might be the answer to your question。它說它使用的是Spring,但我認爲它仍然可以幫助你。讓我在這裏內嵌代碼,以便它更方便:

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

感謝Daniel的幫助。我遇到的最困難的部分是如何將我的JSON建模爲一個類?如果我得到這個部分的工作,我可以很容易地編碼其餘部分。 – ferhan

+0

你可以看看我從JSON寫的POJO類嗎?它看起來正確與否? – ferhan

19

使用傑克遜1.9+的新方法如下:

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

輸出將被格式正確!

+1

不幸的是,如果我的輸入是一個運行時創建的對象,而不是另一個json,那不會有幫助。 – Innokenty

+0

@Innokenty然後跳過第一行。 – muttonUp

+1

@muttonUp很明顯。我甚至已經完成了它,我不知道爲什麼我留下了這樣一個愚蠢的評論=) – Innokenty

11

對於傑克遜1.9,我們可以使用下面的代碼進行漂亮的打印。

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

最簡單的,也(爲v2.3.3)最緊湊的解決方案:

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

你甚至可以進一步縮短:ObjectMapper mapper = new ObjectMapper.enable(SerializationFeature.INDENT_OUTPUT); –

6

我認爲,這是爲了美化JSON數據最簡單的技術,

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

其中響應是一個字符串。

只需通過toString()方法中的4(indentSpaces)即可。

注意:它在沒有任何庫的android中工作正常。但在Java中,你必須使用org.json庫。

+0

值得注意的是使用[JSON in Java(org.json)](https://github.com/stleary/JSON-java)庫。 –

+0

在android中,它可以使用direclty而不需要任何庫管理程序。 –

+0

java也能正常工作:) – sathya