json-simple を使用していますが、JSONデータをきれいに印刷する必要があります(人間が読めるようにします)。
そのライブラリ内でこの機能を見つけることができませんでした。これはどのように一般的に達成されますか?
GSON 素敵な方法でこれを行うことができます:
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(uglyJSONString);
String prettyJsonString = gson.toJson(je);
org.json 組み込みメソッドを使用して、データをきれいに出力しました。
JSONObject json = new JSONObject(jsonString); // Convert text to object
System.out.println(json.toString(4)); // Print it with specified indentation
JSONのフィールドの順序は、定義ごとにランダムです。特定の順序は、パーサーの実装に依存します。
GSON がこれをサポートしているようですが、使用しているライブラリから切り替えるかどうかはわかりません。
ユーザーガイドから:
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);
JSON処理(JSR-353)実装にJava APIを使用している場合は、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();
私の状況では、プリティ印刷をサポートしていないレガシー(非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");
ジャクソン(com.fasterxml.jackson.core
)の場合:
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject))
From: JSON出力のプリティプリントを有効にする方法(Jackson)
私はこれがすでに答えに含まれていることを知っていますが、チャンスがあるので、あなたはすでに依存関係としてジャクソンを持っているので、必要なのは余分なコード行です
既存の回答のほとんどは、何らかの外部ライブラリに依存するか、特別なJavaバージョンが必要です。一般的なJava APIのみを使用して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(" ");
}
}
1行で:
String niceFormattedJson = JsonWriter.formatJson(jsonString)
Json-io libray( https://github.com/jdereg/json-io )は、JDK以外に依存関係のない小さな(75K)ライブラリです。
JSONをきれいに印刷することに加えて、Javaオブジェクト(サイクルを含むJavaオブジェクトグラフ全体)をJSONにシリアル化して読み込むことができます。
これは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>
JSON-P 1.0仕様( JSR-35 )に従って、指定された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;
}
}
以下のようにGsonを使用できます
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(object);
または、以下のようにジャクソンを使用できます
ObjectMapper mapper = new ObjectMapper();
String perttyStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
投稿から Java(Jackson)のJSONをきれいに印刷
この助けを願っています!
ジャクソンを使用して、これは私のために働いた:
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)