web-dev-qa-db-ja.com

JavaのJSONのプリティプリント

json-simple を使用していますが、JSONデータをきれいに印刷する必要があります(人間が読めるようにします)。

そのライブラリ内でこの機能を見つけることができませんでした。これはどのように一般的に達成されますか?

178
mabuzer

GSON 素敵な方法でこれを行うことができます:

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

org.json 組み込みメソッドを使用して、データをきれいに出力しました。

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

JSONのフィールドの順序は、定義ごとにランダムです。特定の順序は、パーサーの実装に依存します。

125
Raghu Kiran

GSON がこれをサポートしているようですが、使用しているライブラリから切り替えるかどうかはわかりません。

ユーザーガイドから:

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

JSON処理(JSR-353)実装にJava AP​​Iを使用している場合は、JsonGeneratorFactoryを作成するときにJsonGenerator.PRETTY_PRINTINGプロパティを指定できます。

次の例は、もともとmy blog post で公開されています。

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
bdoughan

私の状況では、プリティ印刷をサポートしていないレガシー(非JSR)JSONパーサーを使用しています。ただし、きれいに印刷されたJSONサンプルを作成する必要がありました。これは、Java 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");
17
Agnes

GSON を1行できれいに印刷する:

System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(jsonString)));

インライン化に加えて、これは 受け入れられた答え と同等です。

17
Bengt

ジャクソン(com.fasterxml.jackson.core)の場合:

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

From: JSON出力のプリティプリントを有効にする方法(Jackson)

私はこれがすでに答えに含まれていることを知っていますが、チャンスがあるので、あなたはすでに依存関係としてジャクソンを持っているので、必要なのは余分なコード行です

14
oktieh

JSONLibでは、これを使用できます。

String jsonTxt = JSONUtils.valueToString(json, 8, 4);

Javadoc から:

6

既存の回答のほとんどは、何らかの外部ライブラリに依存するか、特別なJavaバージョンが必要です。一般的なJava AP​​Iのみを使用してJSON文字列をきれいに印刷する簡単なコードを次に示します(上位のJava 7で利用可能です。古いバージョンは試していません)。

基本的な考え方は、JSONの特殊文字に基づいてフォーマットを調整することです。たとえば、「{」または「[」が観察された場合、コードは新しい行を作成し、インデントレベルを上げます。

免責事項:いくつかの単純なJSONケース(基本的なキーと値のペア、リスト、ネストされたJSON)でのみこれをテストしたため、引用符付きの文字列値や特殊文字(\ 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("  ");
  }
}
6
asksw0rder

1行で:

String niceFormattedJson = JsonWriter.formatJson(jsonString)

Json-io libray( https://github.com/jdereg/json-io )は、JDK以外に依存関係のない小さな(75K)ライブラリです。

JSONをきれいに印刷することに加えて、Javaオブジェクト(サイクルを含むJavaオブジェクトグラフ全体)をJSONにシリアル化して読み込むことができます。

5

これは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>
5

JSON-P 1.0仕様( JSR-35 )に従って、指定されたJsonStructureJsonObjectまたは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;
    }

}
4
Jens Piegsa

以下のようにGsonを使用できます

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

投稿から Gsonを使用したJSONプリティプリント

または、以下のようにジャクソンを使用できます

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

投稿から Java(Jackson)のJSONをきれいに印刷

この助けを願っています!

4
David Pham

ジャクソンを使用して、これは私のために働いた:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)
0
ObiWanKenobi