জাভাতে প্রিন্ট-মুদ্রণ জেএসওএন


217

আমি ব্যাবহার করছি এবং আমার জেএসওএন ডেটাটি বেশ মুদ্রণ করা দরকার (এটিকে আরও মানব পাঠযোগ্য করে তোলা)।

আমি এই লাইব্রেরির মধ্যে এই কার্যকারিতাটি খুঁজে পাইনি। এটি কীভাবে সাধিত হয়?

উত্তর:


284

GSON এটি একটি দুর্দান্ত উপায়ে করতে পারে:

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

1
ওয়েল, আমি একটি স্ট্রিংকে জসনএলিমেন্টে পার্স করার জন্য কোডটি অন্তর্ভুক্ত করেছি, সাধারণত আপনার ইতিমধ্যে জেএসওএন ডেটা দিয়ে পূর্ববর্তী কাজ থেকে শুরু করে। তবে ব্যবহারটি পরিষ্কার করার জন্য আমি এটি এখানে অন্তর্ভুক্ত করতে চেয়েছিলাম।
রায় হুলহা

যেহেতু এই উত্তরটি আমাকে সাহায্য করেছে। এই বিবৃতিটি কম লাইনে সংকুচিত করতে আমি নীচের কোড যুক্ত করেছি যদি আপনি এটি খুঁজছেন তবে এটি। পাবলিক স্ট্রিং প্রিটিটিফাইজে জসন (স্ট্রিং জেসসন) {জসনএলেটমেন্ট জসনএলিমেন্ট = নতুন জসন পার্সার ()। পার্স (জেসন); নতুন গসনবিল্ডার () সেট করুন .প্রিট্টিপ্রিন্টিং ()। তৈরি করুন ()। টোসন (জসনএলিমেন্ট); }
আহমাদ

2
অতিরিক্ত গ্রন্থাগারের প্রয়োজন ছাড়াই ওপি-র প্রশ্নের উত্তর দেওয়া সম্ভব, কারণ আপনি কেবল রাইনো (জেডিকে 1.7 এবং উপরে) এমবেডড জেএসএন পার্সারটি অ্যাক্সেস করতে পারেন। আমি মনে করি না যে কেবল কোনও ডিবাগিং আউটপুট ফর্ম্যাট করতে কোনও প্রকল্পে একটি গ্রন্থাগার যুক্ত করা বাঞ্ছনীয়। 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 আমদানি করুন;
মাস্টারজয়ে 2

ক্ষেত্রগুলি এলোমেলো ক্রমে না রাখার জন্য কী আছে, আমি তাদের যুক্ত করা ক্রমে এটি চাই?
টমাস অ্যাড্রিয়ান

@ থমাস এড্রিয়ান এটি org.json.JSONObject দিয়ে সম্ভব নয়।
রঘু কিরণ

জন্ডসন-জাভা json ফর্ম্যাট করার সময় অ্যাট্রিবিউট অর্ডার রাখে।
ভ্যালেন্টাইন কোলেস্নিকভ

37

দেখে মনে হচ্ছে জিএসএন এটি সমর্থন করে, যদিও আপনি জানেন না যে আপনি যে লাইব্রেরিটি ব্যবহার করছেন সেটি থেকে আপনি স্যুইচ করতে চান কিনা।

ব্যবহারকারী গাইড থেকে:

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

4
জিএসএন-র সমস্যাটি, এটি জটিল, জসন-সহজ আরও সহজ।
মাবুজার

1
আমি এক বছরেরও বেশি সময় এই সমস্যাটি দেখিনি, তবে আপনি যদি সোর্স কোডটি কিছুটা সংশোধন করতে ইচ্ছুক হন, কোড. google.com/p/json-simple/issues/detail?id=22 এর কিছু তথ্য আছে চমত্কার-মুদ্রণের সাথে জেএসন-সরল বাড়ানো।
বুফেলো বুফালো

কোনও সুন্দর মুদ্রণ বিন্যাস ছাড়াই কেবল স্ট্রিং পান :(
চেরি

এটি স্ট্রিং print r \ n দিয়ে মুদ্রণ করে
স্টোন জ্যাক

ধন্যবাদ। টসস্ট্রিং () এক লাইনে ওভাররাইড করুন: নতুন গসনবিল্ডার () .সেটপ্রেটিপ্রিন্টিং () তৈরি করুন ()। টুজসন (এটি);
KeepAtIt

30

জ্যাকসনের সাথে ( com.fasterxml.jackson.databind):

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

থেকে: কীভাবে সুন্দর মুদ্রণ জেএসএন আউটপুট সক্ষম করবেন (জ্যাকসন)

আমি জানি এটি ইতিমধ্যে উত্তরগুলিতে রয়েছে তবে আমি এটি আলাদাভাবে এখানে লিখতে চাই কারণ সম্ভাবনা হ'ল, আপনার কাছে ইতিমধ্যে জ্যাকসন নির্ভরতা হিসাবে রয়েছেন এবং তাই আপনার প্রয়োজন সমস্ত কোডের একটি অতিরিক্ত লাইন হবে


21

আপনি যদি JSON প্রসেসিং (JSR-353) বাস্তবায়নের জন্য একটি জাভা API ব্যবহার করছেন তবে আপনি 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

আমার পরিস্থিতিটি হল আমার প্রকল্পটি একটি উত্তরাধিকার (নন-জেএসআর) জেএসএন পার্সার ব্যবহার করে যা সুন্দর মুদ্রণ সমর্থন করে না। তবে, আমার সুন্দর প্রিন্টেড জেএসওএন নমুনা তৈরি করা দরকার; যতক্ষণ না আপনি জাভা 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
এটি দুর্দান্ত, জেএস ইঞ্জিনটি এটি করার জন্য ব্যবহার করুন, এত সহজ
med116

সতর্কতা যদি আপনি যত্ন নেন: স্ক্রিপ্টএজাইনম্যানেজারটি API নয়।
nclark


8

বিদ্যমান উত্তরগুলির বেশিরভাগই কোনও না কোনও বাহ্যিক গ্রন্থাগারের উপর নির্ভর করে, বা একটি বিশেষ জাভা সংস্করণ প্রয়োজন। এখানে একটি জাসন স্ট্রিং প্রিন্ট করার জন্য একটি সাধারণ কোড, কেবলমাত্র সাধারণ জাভা এপিআই ব্যবহার করে (জাভা in এ আরও উচ্চতর জন্য উপলব্ধ; যদিও এর চেয়ে পুরানো সংস্করণ চেষ্টা করে নি)।

প্রাথমিক ধারণাটি হ'ল জেএসওএন-এর বিশেষ অক্ষরের উপর ভিত্তি করে ফর্ম্যাটিংটি টাইগার করা। উদাহরণস্বরূপ, যদি একটি '{' বা '[' পর্যবেক্ষণ করা হয়, কোডটি একটি নতুন লাইন তৈরি করবে এবং ইনডেন্ট স্তর বাড়িয়ে তুলবে।

দাবি অস্বীকার: আমি কেবল এটি কিছু সাধারণ জেএসএন ক্ষেত্রে (বেসিক কী-মান জোড়, তালিকা, নেস্টেড জেএসওএন) পরীক্ষা করেছিলাম যাতে এটিতে আরও সাধারণ জেএসওএন পাঠ্যের জন্য কিছু কাজের প্রয়োজন হতে পারে যেমন অভ্যন্তরের উদ্ধৃতিগুলির সাথে স্ট্রিং মান বা বিশেষ অক্ষর (, n, \ t ইত্যাদি)।

/**
 * 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("  ");
  }
}

প্রথম পড়ার সময় আমি এই পরামর্শটি নিয়ে অত্যন্ত বিরক্ত হয়েছিলাম, তবে সমস্ত উত্তর পড়ার পরে, এটিই সেরা সমাধান। কমপক্ষে, যদি এটি কিছু ডিবাগিং আউটপুট জন্য হয় এবং আপনি নির্ভরতাগুলিতে টানতে চান না, যাতে আপনি পরে আবার মুছে ফেলতে চাইতে পারেন। আপনাকে অনেক ধন্যবাদ!
ব্যবহারকারী 2081279

7

এক লাইনে:

String niceFormattedJson = JsonWriter.formatJson(jsonString)

জসন-আইও লিবারে ( https://github.com/jdereg/json-io ) একটি ছোট (75 কে) লাইব্রেরি যা জেডিকে ব্যতীত অন্য কোনও নির্ভরতা নেই।

জেএসএন-কে প্রিন্টিং-প্রিন্টিং ছাড়াও, আপনি জাএস অবজেক্টগুলি (চক্র সহ পুরো জাভা অবজেক্ট গ্রাফগুলি) জেএসএনে সিরিয়ালাইজ করতে পারেন, পাশাপাশি সেগুলি পড়তে পারেন।


7

এখন এটি JSONLib গ্রন্থাগারের মাধ্যমে অর্জন করা যেতে পারে:

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

যদি (এবং কেবলমাত্র) আপনি ওভারলোডেড toString(int indentationFactor)পদ্ধতি ব্যবহার করেন এবং মানক toString()পদ্ধতিটি নয়।

আমি এটি API এর নিম্নলিখিত সংস্করণে যাচাই করেছি:

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

3
যদিও এই লাইব্রেরিটি প্রশ্নের উত্তর দিতে সহায়তা করতে পারে, এটি কীভাবে কাজ করে সে সম্পর্কিত কিছু ব্যাখ্যা দিয়ে সমস্যার ক্ষেত্রে এটি কীভাবে প্রযোজ্য তা উদাহরণ অন্তর্ভুক্ত করা ভাল ।
ফ্রান্সেসকো মেনজানি

1
ঠিক আছে প্রতিক্রিয়ার জন্য ধন্যবাদ। যদিও মনে আছে, আমার মতো ব্যক্তিরা স্বেচ্ছাসেবক এবং মানের সাথে মান পূরণের গ্যারান্টি দেয় এমন একটি পরিষেবা প্রদানের জন্য তাদের বেতন দেওয়া হচ্ছে না। আমাদের বেশিরভাগ সময় সীমিত থাকায় আমরা প্রায়শই কাজের মাঝেই থাকি বা পারিবারিক কর্তব্য থাকে। এজন্য পাঠকদের কাছে "সম্পাদনা" পাওয়া যায়, তাই আমরা একে অপরের পোস্টকে আরও সহায়ক করতে পারি।
শ্রীধর সারনোবাত

6

প্রদত্ত ( বা ) এর জন্য আরও বর্তমান সমাধান JSON-P 1.0 স্পেস ( জেএসআর -353 ) অনুসরণ করে দেখতে পারা যায়:JsonStructureJsonObjectJsonArray

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 = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(object);

জেসন পোস্টটি থেকে জেসন ব্যবহার করে সুন্দর প্রিন্ট করুন

বিকল্পভাবে, আপনি নীচের মত জ্যাকসন ব্যবহার করতে পারেন

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

জাভাতে প্র্যাকটি প্রিন্ট জেএসওন পোস্ট থেকে (জ্যাকসন)

এই সাহায্য আশা করি!


4

Org json ব্যবহার করা হচ্ছে। রেফারেন্স লিঙ্ক

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

গসন ব্যবহার করা। রেফারেন্স লিঙ্ক

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থেকে এলো?
সার্জেট


-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"
    }
}    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.