Pretty-Print JSON в Java

Я использую 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); 

Если вы используете реализацию Java API для JSON Processing (JSR-353), тогда вы можете указать свойство JsonGenerator.PRETTY_PRINTING при создании JsonGeneratorFactory .

Следующий пример был первоначально опубликован в моем сообщении в блоге .

 import java.util.*; import javax.json.Json; import javax.json.stream.*; Map properties = new HashMap(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(); 

Довольно печать с помощью GSON в одной строке:

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

Помимо вложения, это эквивалентно принятому ответу .

Моя ситуация заключается в том, что мой проект использует устаревший (не 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"); 

С jacksonом ( com.fasterxml.jackson.core ):

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

From: Как включить довольно печатный вывод JSON (Jackson)

Я знаю, что это уже в ответах, но я хочу написать здесь отдельно, потому что, скорее всего, у вас уже есть jackson как зависимость, и поэтому все, что вам понадобится, будет дополнительной строкой кода

В JSONLib вы можете использовать это:

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

Из Джавадока :

В одной строке:

 String niceFormattedJson = JsonWriter.formatJson(jsonString) 

Json-io libray ( https://github.com/jdereg/json-io ) – небольшая (75K) библиотека без каких-либо других зависимостей, чем JDK.

В дополнение к довольно-печатной JSON вы можете сериализовать объекты Java (целые графические объекты Java-графики с циклами) в JSON, а также прочитать их.

Теперь это может быть достигнуто с помощью библиотеки JSONLib:

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

Если (и только если) вы используете перегруженный метод toString(int indentationFactor) а не стандартный метод toString() .

Я проверил это в следующей версии API:

  org.json json 20140107  

Следуя спецификациям 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 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); 

Из сообщения JSON довольно печатает с использованием Gson

Кроме того, вы можете использовать jacksonа, как показано ниже

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

Из сообщения Pretty print JSON в Java (Jackson)

Надеюсь, эта помощь!

Большинство существующих ответов либо зависят от некоторой внешней библиотеки, либо требуют специальной версии Java. Вот простой код для правильной печати строки JSON, только с использованием общих Java-API (ansible в Java 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(" "); } } 

Это сработало для меня, используя jacksonа:

 mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString) 
Давайте будем гением компьютера.