जैक्सन स्ट्रिंग का उपयोग करके बहुत सुंदर प्रिंट JSON आउटपुट का उपयोग करें


165

यह 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 Stringको सुंदर प्रिंट 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));

लेकिन यह उस तरीके से काम नहीं करता जिस तरह से मुझे आउटपुट की ज़रूरत थी जैसा कि ऊपर उल्लेख किया गया है।

यहाँ ऊपर के JSON के लिए उपयोग किया जा रहा POJO है:

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

और फिर नीचे के परिणाम पृष्ठ में इसे दिखाता है:

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

जिसकी मुझे जरूरत नहीं है। मुझे उस तरह की ज़रूरत थी जिस तरह से ऊपर छपी है। क्या कोई मुझे बता सकता है कि ऐसा क्यों हुआ?

जवाबों:


252

किसी भी पुराने JSON को इंडेंट करने के लिए, बस इसे इस प्रकार बांधें Object, जैसे:

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

और फिर इसे इंडेंटेशन के साथ लिखें:

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

यह आपके डेटा को मैप करने के लिए वास्तविक POJO को परिभाषित करने से बचता है।

या आप JsonNode(JSON ट्री) का भी उपयोग कर सकते हैं ।


धन्यवाद StaxMan, मुझे लगता है कि यह काम कर रहा है। जब मैं इंडेंट आउट प्रिंट करता हूं तो मुझे जिस तरह की जरूरत होती है, उसी तरीके से मुझे मिलता है। लेकिन जब मैं मॉडल में जोड़ने के लिए इंडेंटेड का उपयोग करता हूं ताकि मैं उन्हें परिणाम पृष्ठ पर दिखा सकूं। यह अभी भी दो तीन लाइनों में मुद्रित हो जाता है। मैंने प्रश्न को अपडेट कर दिया है, शायद आपको कुछ और विचार मिलेगा जो अभी हो रहा है।
शस्त्रागार

समस्या तब स्प्रिंग के साथ है - मुझे लगता है कि यह एक पीओजेओ को विशेषता के रूप में उम्मीद करता है, न कि पूर्व-स्वरूपित स्ट्रिंग के लिए। इसलिए इसे स्वयं प्रारूपित करने की कोशिश करने के बजाय, आपको स्प्रिंग को ऐसा करने के लिए बताना होगा। जैक्सन का उपयोग करते समय, इंडेंटेशन का उपयोग करने के लिए इसे कॉन्फ़िगर करना संभव होना चाहिए। हालांकि ईमानदार होने के लिए, मुझे यकीन नहीं है कि आपको प्रतिक्रिया के लिए इसे इंडेंट करने की आवश्यकता क्यों है।
स्टैक्मैन मैन 26'13

30
नमस्ते, DefaultPrettyPrintingWriter () को हटा दिया गया है। 1.9 के बाद से, इसके बजाय राइटरडिफॉल्टप्रेप्टीप्रिन्टर () का उपयोग करें। देखें: jackson.codehaus.org/1.9.0/javadoc/org/codehaus/jackson/map/…
Browny Lin

6
जैक्सन 2 के लिए, SerializationFeature.INDENT_OUTPUT का उपयोग करें, जैसा कि नीचे मार्सेलो सी द्वारा निर्दिष्ट किया गया है
माइक आर

किसी भी विचार कैसे जैकसन का उपयोग कर लिखित मूल्य की राशि प्रकाशित करने के लिए?
रेयांश मिश्रा

125

सबसे सरल और सबसे कॉम्पैक्ट समाधान (v2.3.3 के लिए):

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

21
आप वास्तव में इसे और भी छोटा कर सकते हैं: ObjectMapper mapper = new ObjectMapper.enable (SerializationFeature.INDENT_OUTPUT);
जेसन निकोल्स

26

जैक्सन 1.9+ का उपयोग करने का नया तरीका निम्नलिखित है:

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

आउटपुट सही ढंग से स्वरूपित किया जाएगा!


1
यदि मेरा इनपुट रनटाइम ऑब्जेक्ट है, तो दुर्भाग्य से, इससे कोई मदद नहीं मिलती है, न कि किसी अन्य जसन से।
मासूमियत

@ पहले तो पहली लाइन छोड़ें।
मटनअप सिप

2
@muttonUp हाँ, जाहिर है। मैंने भी कर लिया है, मुझे नहीं पता कि मैंने ऐसी बेवकूफी भरी टिप्पणी क्यों छोड़ दी =)
मासूम

17

जैक्सन 1.9 के लिए, हम सुंदर प्रिंट के लिए निम्न कोड का उपयोग कर सकते हैं।

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

11

मुझे लगता है, यह जोंस डेटा को सुशोभित करने की सबसे सरल तकनीक है,

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

जहां रिस्पांस एक स्ट्रिंग है।

बस toString()विधि में 4 (इंडेंटस्पेस) पास करें ।

नोट: यह किसी भी पुस्तकालय के बिना Android में ठीक काम करता है। लेकिन जावा में आपको org.json लाइब्रेरी का उपयोग करना होगा


3
वर्थ नोटिंग यह जावा (org.json) लाइब्रेरी में JSON का उपयोग कर रहा है ।
स्टीव चेम्बर्स

Android में, यह बिना किसी लाइब्रेर के direclty का उपयोग कर सकता है।
अमन गुप्ता - ShooTeR

String json = new GsonBuilder().setPrettyPrinting().create().toJson(map); String indentedJson = (new JSONObject(json)).toString(4);किसी कारण से दूसरा व्यक्ति चाबियों का क्रम खो रहा है
मिखाइल माइकेलिडिस

वर्तमान दृष्टिकोण, दुर्भाग्य से, जोंस ऑब्जेक्ट्स की सूची को हैंडल नहीं करता है। मेरा मतलब है [{"id": "1"}, {"id": "2"}]
जिनी

4

ऐसा लगता है कि यह आपके प्रश्न का उत्तर हो सकता है । यह कहता है कि यह स्प्रिंग का उपयोग कर रहा है, लेकिन मुझे लगता है कि आपको अभी भी आपके मामले में मदद करनी चाहिए। मुझे कोड को इनलाइन करने दें ताकि यह अधिक सुविधाजनक हो:

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

मदद के लिए धन्यवाद डैनियल। मेरे पास जो सबसे कठिन हिस्सा है वह यह है कि मेरे JSON को कक्षा में कैसे बनाया जाए? अगर मुझे वह हिस्सा काम आता है, तो मैं आसानी से इसे आराम से कोड कर सकता हूं।
शस्त्रागार

क्या आप मेरे POJO वर्ग पर एक नज़र डाल सकते हैं जो मैंने JSON से लिखा है? यह सही लग रहा है या नहीं?
शस्त्रागार

3

आप इसे bellow तरीकों का उपयोग करके प्राप्त कर सकते हैं:

1. अपाचे से जैक्सन का उपयोग करना

    String formattedData=new ObjectMapper().writerWithDefaultPrettyPrinter()
.writeValueAsString(YOUR_JSON_OBJECT);

आयात bellow कक्षा:

import com.fasterxml.jackson.databind.ObjectMapper;

यह निर्भरता निर्भर करता है:

compile 'com.fasterxml.jackson.core:jackson-core:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.3'

2. Google से Gson का उपयोग करना

String formattedData=new GsonBuilder().setPrettyPrinting()
    .create().toJson(YOUR_OBJECT);

आयात bellow कक्षा:

import com.google.gson.Gson;

यह है:

compile 'com.google.code.gson:gson:2.8.2'

यहां, आप रिपॉजिटरी से सही अपडेटेड वर्जन डाउनलोड कर सकते हैं।


2

ObjectMapper.readTree() इसे एक पंक्ति में कर सकते हैं:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(mapper.readTree(json));

1
मुझे यह उत्तर पसंद आने का कारण यह है कि यह JSON प्रकारों के प्रत्यक्ष मानचित्रण के अलावा किसी भी अन्य वस्तु रूपांतरण को नहीं करता है। जब तक इनपुट स्ट्रिंग JSON मान्य है, तब तक हम जानते हैं कि आउटपुट स्ट्रिंग शब्द JSON के समतुल्य होगा।
एम। जस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.