2013-01-25 28 views
100

Đây là chuỗi JSON tôi have-Chuyển đổi JSON String để đầu ra JSON Khá In bằng Jackson

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

tôi cần phải chuyển đổi chuỗi JSON trên vào Khá In JSON Output (sử dụng Jackson) như liệt kê dưới đây

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

Có ai có thể cung cấp cho tôi ví dụ về ví dụ trên không? Làm thế nào để đạt được kịch bản này, tôi biết có rất nhiều ví dụ nhưng tôi không thể hiểu những người đúng. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao với một ví dụ đơn giản.

Cập nhật:

Dưới đây là đoạn code tôi đang sử dụng

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

Nhưng điều này không làm việc với cách tôi cần đầu ra như đã đề cập ở trên

Dưới đây là là POJO Tôi đang sử dụng cho các JSON ở trên-

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

Bất cứ ai có thể cho tôi biết liệu tôi có đúng POJO cho JSON hay không?

Cập nhật: -

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

Dưới dòng in ra cái gì đó như 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" 
    } ] 
} 

đó là con đường tôi cần phải được hiển thị. Nhưng khi tôi thêm nó vào mô hình như this-

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

Và sau đó cho thấy nó ra trong một trang resultform jsp như liệt kê dưới đây

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

    </fieldset> 

tôi nhận được một cái gì đó giống như 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" } ] } 

mà tôi không cần. Tôi cần cách nó được in ở trên. Bất cứ ai có thể cho tôi biết lý do tại sao nó đã xảy ra như thế này?

+2

Sẽ tuyệt vời nếu bạn hiển thị cho chúng tôi mã bạn đã viết cho đến thời điểm này. – Swapnil

+0

@Swapnil, đã cập nhật câu hỏi bằng mã cho đến giờ tôi có. – ferhan

Trả lời

124

Để thụt bất kỳ JSON cũ, chỉ cần gắn nó như Object, như:

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

và sau đó viết nó ra với thụt đầu dòng:

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

điều này tránh việc bạn phải xác định POJO thực tế để ánh xạ dữ liệu.

Hoặc bạn cũng có thể sử dụng JsonNode (Cây JSON).

+0

Cảm ơn StaxMan, tôi đoán điều này đang hoạt động. Khi tôi in thụt vào, tôi nhận được theo cách tôi cần. Nhưng khi tôi sử dụng thụt lề để thêm vào Mô hình để tôi có thể hiển thị chúng trong trang kết quả. Nó vẫn được in trong hai ba dòng. Tôi đã cập nhật câu hỏi, có thể bạn sẽ nhận được một số ý tưởng hơn những gì đang xảy ra bây giờ. – ferhan

+0

Vấn đề là với mùa xuân sau đó - tôi đoán nó mong đợi một POJO như là thuộc tính, và không phải là một chuỗi định dạng trước. Vì vậy, thay vì tự định dạng nó, bạn cần phải nói với Spring để làm điều này. Khi sử dụng Jackson, bạn có thể cấu hình nó để sử dụng thụt đầu dòng. Mặc dù phải trung thực, tôi không chắc chắn tại sao bạn thậm chí cần phải thụt lề để trả lời. – StaxMan

+20

Xin chào, mặc địnhPrettyPrintingWriter() đã không được chấp nhận. Từ 1.9, sử dụng writerWithDefaultPrettyPrinter() để thay thế. Tham khảo: 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. Nó nói rằng nó đang sử dụng Spring, nhưng tôi nghĩ rằng vẫn nên giúp bạn trong trường hợp của bạn. Hãy để tôi inline mã ở đây vì vậy nó thuận tiện hơn:

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

Cảm ơn Daniel đã giúp đỡ. Phần khó khăn nhất mà tôi đang gặp là làm thế nào để mô hình JSON của tôi thành một lớp học? Nếu tôi nhận được một phần làm việc, tôi có thể dễ dàng mã phần còn lại của nó. – ferhan

+0

Bạn có thể xem qua lớp POJO mà tôi đã viết từ JSON không? Có vẻ đúng hay không? – ferhan

19

Cách mới sử dụng Jackson 1.9+ như sau:

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

Kết quả sẽ được định dạng chính xác!

+1

Thật không may, điều đó không giúp ích nếu đầu vào của tôi là một đối tượng thời gian chạy được tạo ra, không phải là một json khác. – Innokenty

+0

@Innokenty Sau đó bỏ qua dòng đầu tiên. – muttonUp

+1

@muttonUp Vâng, rõ ràng. Tôi thậm chí đã làm điều đó, tôi không biết tại sao tôi để lại một bình luận ngu ngốc như vậy =) – Innokenty

11

Đối với Jackson 1.9, chúng tôi có thể sử dụng mã sau để in đẹp.

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

Cách đơn giản nhất và cũng là giải pháp nhỏ gọn nhất (ví v2.3.3):

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

Bạn thực sự có thể rút ngắn rằng hơn nữa: ObjectMapper mapper = new ObjectMapper.enable (SerializationFeature.INDENT_OUTPUT); –

6

Tôi nghĩ rằng, đây là kỹ thuật đơn giản nhất để làm đẹp các dữ liệu json,

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

trong đó Trả lời là một Chuỗi.

Chỉ cần chuyển 4 (indentSpaces) theo phương thức toString().

Lưu ý: Nó hoạt động tốt trong Android mà không cần bất kỳ thư viện nào. Nhưng trong java bạn phải sử dụng thư viện org.json.

+0

Đáng chú ý là sử dụng thư viện [JSON in Java (org.json)] (https://github.com/stleary/JSON-java). –

+0

Trong android, nó có thể sử dụng direclty mà không có bất kỳ libraray nào. –

+0

java cũng hoạt động tốt tuyệt vời :) – sathya

Các vấn đề liên quan