जावा में सुंदर-प्रिंट JSON


217

मैं उपयोग कर रहा हूँ और मुझे JSON डेटा को बहुत प्रिंट करने की आवश्यकता है (इसे अधिक मानव पठनीय बनाएं)।

मैं उस लाइब्रेरी के भीतर इस कार्यक्षमता को खोजने में सक्षम नहीं हूं। यह सामान्यतः कैसे प्राप्त किया जाता है?

जवाबों:


285

GSON एक अच्छे तरीके से कर सकता है:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(uglyJSONString);
String prettyJsonString = gson.toJson(je);

1
वैसे मैंने JsonElement में एक स्ट्रिंग को पार्स करने के लिए कोड शामिल किया है, आमतौर पर आपके पास पहले से ही काम है जो आप JSON डेटा के साथ करते हैं। लेकिन मैं उपयोग को स्पष्ट करने के लिए इसे यहाँ शामिल करना चाहता था।
रे हुलह

चूंकि इस जवाब ने मेरी मदद की। मैंने इस कथन को कम पंक्तियों में सिकोड़ने के लिए नीचे कोड जोड़ा है यदि यह वही है जो आप खोज रहे हैं। public String prettifyJson (स्ट्रिंग json) {JsonElement jsonElement = new JsonPser ()। parse (json); नया GsonBuilder () सेट करें ।PPtytyPrinting ()। create () .Json (jsonblement); }
अहमद

2
अतिरिक्त पुस्तकालयों की आवश्यकता के बिना ओपी के प्रश्न का उत्तर देना संभव है, क्योंकि आप बस राइनो (JDK 1.7 और ऊपर) में एम्बेडेड JSON पार्सर तक पहुंच सकते हैं। मुझे नहीं लगता कि कुछ डिबगिंग आउटपुट को प्रारूपित करने के लिए एक पुस्तकालय को एक परियोजना में जोड़ना वांछनीय है। scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
एग्नेस

1
Org.json विकल्प के विपरीत, सुंदर मुद्रण का GSON तरीका परिवर्तन के बाद तत्वों के क्रम को बरकरार रखता है।
आइडिन के।

1
सूचक के लिए धन्यवाद करने के लिए GsonBuilder, के बाद से मैं का उपयोग कर रहा था gson.toJson(object)मैं बस से मेरी इन्स्टेन्शियशन बदलना पड़ा Gson gson = new Gson();करने के लिए Gson gson = new GsonBuilder().setPrettyPrinting().create(); और मेरे कोड काम करने के लिए जारी रखा, लेकिन बहुत एक पंक्ति के बजाय वस्तु छपी।
cptully

153

मैंने डेटा को सुंदर रूप से प्रिंट करने के लिए org.json अंतर्निहित विधियों का उपयोग किया ।

JSONObject json = new JSONObject(jsonString); // Convert text to object
System.out.println(json.toString(4)); // Print it with specified indentation

JSON में खेतों का क्रम प्रति परिभाषा यादृच्छिक है। एक विशिष्ट आदेश पार्सर कार्यान्वयन के अधीन है।


7
मैं इस समाधान को भी पसंद करता हूं, क्योंकि आपको अन्य जवाबों की तरह अतिरिक्त निर्भरता को आयात करने की आवश्यकता नहीं है।
gdrt

3
एक महत्वपूर्ण आयात गुम - आयात org.json.JSONObject;
मास्टरजे २

वहाँ वैसे भी यादृच्छिक क्रम में फ़ील्ड नहीं है, मैं इसे उस क्रम में चाहता हूँ जिसे मैंने उन्हें जोड़ा है?
थॉमस एड्रियन

@ThomasAdrian यह org.json.JSONObject के साथ संभव नहीं है।
रघु किरण

अंडरस्कोर-जावा जावा को फॉर्मेट करते समय विशेषता क्रम रखता है।
वैलेंटाइन कोलेनिकोव

37

ऐसा लगता है कि जीएसओएन इसका समर्थन करता है, हालांकि मुझे नहीं पता कि क्या आप उस लाइब्रेरी से स्विच करना चाहते हैं जिसका आप उपयोग कर रहे हैं।

उपयोगकर्ता गाइड से:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);

4
जीएसओएन के साथ समस्या, यह जटिल है, जोसन-सरल बहुत आसान है।
मबुज़ेर

1
मैंने एक साल में इस मुद्दे को नहीं देखा है, लेकिन यदि आप स्रोत कोड को थोड़ा संशोधित करने के लिए तैयार हैं, तो code.google.com/p/json-simple/issues/detail?id=22 पर कुछ जानकारी है सुंदर छपाई के साथ जोंस-सरल को बढ़ाना।
भैंस बफेलो

बिना किसी सुंदर प्रिंट फॉर्मेटिंग के बस स्ट्रिंग मिल गया :(
चेरी

यह String with \ r \ n
स्टोन जैक

धन्यवाद। .String () एक पंक्ति में ओवरराइड करें: नया GsonBuilder ()। setPrettyPrinting ()। create ()) toJson (यह);
KeepAtIt

30

जैक्सन के साथ ( com.fasterxml.jackson.databind):

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject))

से: सुंदर प्रिंट JSON आउटपुट (जैक्सन) कैसे सक्षम करें

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


21

यदि आप JSON प्रसंस्करण (JSR-353) कार्यान्वयन के लिए जावा एपीआई का उपयोग कर रहे हैं, तो आप JsonGenerator.PRETTY_PRINTINGसंपत्ति बनाते हैं जब आप एक बना सकते हैं JsonGeneratorFactory

निम्नलिखित उदाहरण मूल रूप से मेरे ब्लॉग पोस्ट पर प्रकाशित किया गया है ।

import java.util.*;
import javax.json.Json;
import javax.json.stream.*;

Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JsonGenerator.PRETTY_PRINTING, true);
JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties);
JsonGenerator jg = jgf.createGenerator(System.out);

jg.writeStartObject()                    // {
    .write("name", "Jane Doe")           //    "name":"Jane Doe",
    .writeStartObject("address")         //    "address":{
        .write("type", 1)                //        "type":1,
        .write("street", "1 A Street")   //        "street":"1 A Street",
        .writeNull("city")               //        "city":null,
        .write("verified", false)        //        "verified":false
    .writeEnd()                          //    },
    .writeStartArray("phone-numbers")    //    "phone-numbers":[
        .writeStartObject()              //        {
            .write("number", "555-1111") //            "number":"555-1111",
            .write("extension", "123")   //            "extension":"123"
        .writeEnd()                      //        },
        .writeStartObject()              //        {
            .write("number", "555-2222") //            "number":"555-2222",
            .writeNull("extension")      //            "extension":null
        .writeEnd()                      //        }
    .writeEnd()                          //    ]
.writeEnd()                              // }
.close();

18

मेरी स्थिति यह है कि मेरी परियोजना एक विरासत (गैर-जेएसआर) JSON पार्सर का उपयोग करती है जो सुंदर मुद्रण का समर्थन नहीं करती है। हालांकि, मुझे सुंदर मुद्रित JSON नमूने का उत्पादन करने की आवश्यकता थी; जब तक आप जावा 7 और इसके बाद के संस्करण का उपयोग कर रहे हैं, तब तक कोई अतिरिक्त लाइब्रेरी जोड़ना संभव नहीं है:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine scriptEngine = manager.getEngineByName("JavaScript");
scriptEngine.put("jsonString", jsonStringNoWhitespace);
scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
String prettyPrintedJson = (String) scriptEngine.get("result");

3
यह बहुत ही सरल है, इसे करने के लिए js इंजन का उपयोग करें, इतना सरल
med116

चेतावनी यदि आप परवाह करते हैं: ScriptEngineManager API नहीं है।
2'18


8

मौजूदा जवाबों में से अधिकांश या तो कुछ बाहरी पुस्तकालय पर निर्भर करते हैं, या एक विशेष जावा संस्करण की आवश्यकता होती है। यहाँ एक JSON स्ट्रिंग को सुंदर रूप से प्रिंट करने के लिए एक सरल कोड है, केवल सामान्य जावा एपीआई (उच्चतर के लिए जावा 7 में उपलब्ध) का उपयोग करके (हालांकि पुराने संस्करण की कोशिश नहीं की गई है)।

मूल विचार JSON में विशेष वर्णों के आधार पर स्वरूपण को छोटा करना है। उदाहरण के लिए, यदि कोई '{' या '[' देखा जाता है, तो कोड एक नई लाइन बनाएगा और इंडेंट स्तर को बढ़ाएगा।

डिस्क्लेमर: मैंने केवल कुछ साधारण JSON मामलों (बेसिक की-वैल्यू पेयर, लिस्ट, नेस्टेड JSON) के लिए यह परीक्षण किया है, इसलिए इसे और अधिक सामान्य JSON टेक्स्ट के लिए कुछ काम करने की आवश्यकता हो सकती है, जैसे कि उद्धरण के अंदर स्ट्रिंग मान, या विशेष वर्ण (\ n, \) टी आदि)।

/**
 * A simple implementation to pretty-print JSON file.
 *
 * @param unformattedJsonString
 * @return
 */
public static String prettyPrintJSON(String unformattedJsonString) {
  StringBuilder prettyJSONBuilder = new StringBuilder();
  int indentLevel = 0;
  boolean inQuote = false;
  for(char charFromUnformattedJson : unformattedJsonString.toCharArray()) {
    switch(charFromUnformattedJson) {
      case '"':
        // switch the quoting status
        inQuote = !inQuote;
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ' ':
        // For space: ignore the space if it is not being quoted.
        if(inQuote) {
          prettyJSONBuilder.append(charFromUnformattedJson);
        }
        break;
      case '{':
      case '[':
        // Starting a new block: increase the indent level
        prettyJSONBuilder.append(charFromUnformattedJson);
        indentLevel++;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        break;
      case '}':
      case ']':
        // Ending a new block; decrese the indent level
        indentLevel--;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ',':
        // Ending a json item; create a new line after
        prettyJSONBuilder.append(charFromUnformattedJson);
        if(!inQuote) {
          appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        }
        break;
      default:
        prettyJSONBuilder.append(charFromUnformattedJson);
    }
  }
  return prettyJSONBuilder.toString();
}

/**
 * Print a new line with indention at the beginning of the new line.
 * @param indentLevel
 * @param stringBuilder
 */
private static void appendIndentedNewLine(int indentLevel, StringBuilder stringBuilder) {
  stringBuilder.append("\n");
  for(int i = 0; i < indentLevel; i++) {
    // Assuming indention using 2 spaces
    stringBuilder.append("  ");
  }
}

पहले पढ़ने पर मैं इस सुझाव से बहुत नाराज था, लेकिन सभी उत्तरों को पढ़ने के बाद, यह सबसे अच्छा समाधान है। कम से कम, अगर यह सिर्फ कुछ डिबगिंग आउटपुट के लिए है, और आप निर्भरता में नहीं खींचना चाहते हैं, जिसे आप बाद में फिर से निकालना चाह सकते हैं। आपका बहुत बहुत धन्यवाद!
user2081279

7

एक पंक्ति में:

String niceFormattedJson = JsonWriter.formatJson(jsonString)

Json-io libray ( https://github.com/jdereg/json-io ) एक छोटी (75K) लाइब्रेरी है जिसमें JDK के अलावा कोई अन्य निर्भरता नहीं है।

सुंदर मुद्रण JSON के अलावा, आप जावा ऑब्जेक्ट (साइकिल के साथ पूरे जावा ऑब्जेक्ट ग्राफ़) को JSON में अनुक्रमित कर सकते हैं, साथ ही साथ उन्हें पढ़ भी सकते हैं।


7

अब इसे JSONLib लाइब्रेरी के साथ प्राप्त किया जा सकता है:

http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONObject.html

यदि (और केवल यदि) आप ओवरलोड toString(int indentationFactor)विधि का उपयोग करते हैं, तो मानक toString()विधि का नहीं।

मैंने एपीआई के निम्नलिखित संस्करण पर इसे सत्यापित किया है:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20140107</version>
</dependency>

3
इस पुस्तकालय सवाल का जवाब में मदद मिल सकती है, यह बेहतर होगा एक शामिल करने के लिए होता है उदाहरण यह है कि कैसे कुछ के साथ समस्या के लिए लागू है की व्याख्या यह कैसे काम करता के बारे में।
फ्रांसेस्को मेंजानी

1
प्रतिक्रिया के लिए ठीक है धन्यवाद। हालांकि याद रखें, मेरे जैसे लोग स्वयंसेवक हैं और उन्हें ऐसी सेवा प्रदान करने के लिए भुगतान नहीं किया जा रहा है जो गुणवत्ता मानकों को पूरा करने की गारंटी देता है। हमारे पास सीमित समय है क्योंकि हम अक्सर काम के बीच में होते हैं, या परिवार के कर्तव्य होते हैं। इसलिए "एडिट" पाठकों के लिए उपलब्ध है, इसलिए हम एक-दूसरे के पोस्ट को अधिक उपयोगी बना सकते हैं।
श्रीधर सरनोबत

6

JSON-P 1.0 चश्मा ( JSR-353 ) के बाद दिए गए JsonStructure( JsonObjectया JsonArray) के लिए एक और अधिक वर्तमान समाधान इस तरह दिख सकता है:

import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import javax.json.Json;
import javax.json.JsonStructure;
import javax.json.JsonWriter;
import javax.json.JsonWriterFactory;
import javax.json.stream.JsonGenerator;

public class PrettyJson {

    private static JsonWriterFactory FACTORY_INSTANCE;

    public static String toString(final JsonStructure status) {

        final StringWriter stringWriter = new StringWriter();

        final JsonWriter jsonWriter = getPrettyJsonWriterFactory()
                .createWriter(stringWriter);

        jsonWriter.write(status);
        jsonWriter.close();

        return stringWriter.toString();
    }

    private static JsonWriterFactory getPrettyJsonWriterFactory() {
        if (null == FACTORY_INSTANCE) {
            final Map<String, Object> properties = new HashMap<>(1);
            properties.put(JsonGenerator.PRETTY_PRINTING, true);
            FACTORY_INSTANCE = Json.createWriterFactory(properties);
        }
        return FACTORY_INSTANCE;
    }

}


5

आप नीचे दिए गए तरह Gson का उपयोग कर सकते हैं

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(object);

पोस्ट से JSON सुंदर प्रिंट Gson का उपयोग कर

वैकल्पिक रूप से, आप नीचे दिए गए जैक्सन का उपयोग कर सकते हैं

ObjectMapper mapper = new ObjectMapper();
String perttyStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);

जावा (जैक्सन) में सुंदर प्रिंट JSON पोस्ट से

उममीद है कि इससे मदद मिलेगी!


4

Org json का उपयोग करना। संदर्भ लिंक

JSONObject jsonObject = new JSONObject(obj);
String prettyJson = jsonObject.toString(4);

Gson का उपयोग करना। संदर्भ लिंक

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(obj);

जैक्सन का उपयोग करना। संदर्भ लिंक

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

गेंसन का उपयोग करना। संदर्भ लिंक

Genson prettyGenson = new GensonBuilder().useIndentation(true).create();
String prettyJson = prettyGenson.serialize(obj);

1

जैक्सन का उपयोग करते हुए इसने मेरे लिए काम किया:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)

यह कहां mapperसे आया?
Sertage


-2

अंडरस्कोर-जावा में स्थिर विधि है U.formatJson(json)। पांच प्रारूप प्रकार समर्थित हैं: 2, 3, 4, टैब और कॉम्पैक्ट। मैं परियोजना का अनुरक्षक हूं। जीवंत उदाहरण

import com.github.underscore.lodash.U;

import static com.github.underscore.lodash.Json.JsonStringBuilder.Step.TABS;
import static com.github.underscore.lodash.Json.JsonStringBuilder.Step.TWO_SPACES;

public class MyClass {

    public static void main(String args[]) {
        String json = "{\"Price\": {"
        + "    \"LineItems\": {"
        + "        \"LineItem\": {"
        + "            \"UnitOfMeasure\": \"EACH\", \"Quantity\": 2, \"ItemID\": \"ItemID\""
        + "        }"
        + "    },"
        + "    \"Currency\": \"USD\","
        + "    \"EnterpriseCode\": \"EnterpriseCode\""
        + "}}";
        System.out.println(U.formatJson(json, TWO_SPACES)); 
        System.out.println(U.formatJson(json, TABS)); 
    }
}

आउटपुट:

{
  "Price": {
    "LineItems": {
      "LineItem": {
        "UnitOfMeasure": "EACH",
        "Quantity": 2,
        "ItemID": "ItemID"
      }
    },
    "Currency": "USD",
    "EnterpriseCode": "EnterpriseCode"
  }
}
{
    "Price": {
        "LineItems": {
            "LineItem": {
                "UnitOfMeasure": "EACH",
                "Quantity": 2,
                "ItemID": "ItemID"
            }
        },
        "Currency": "USD",
        "EnterpriseCode": "EnterpriseCode"
    }
}    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.