Довольно-печати в формате JSON в Java


Я использую json-простой и мне нужно довольно-распечатать данные JSON (сделать его более читаемым человеком).

Я не смог найти этой функции в этой библиотеке. Как это обычно достигается?

14 155

14 ответов:

GSON можно сделать это в хорошем смысле:

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

Я орг.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.

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

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();

качественная печать с 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");

С Джексоном (com.fasterxml.jackson.core):

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

от: Как включить pretty print JSON output (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:

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

после спецификаций 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;
    }

}

Вы можете использовать Gson, как показано ниже

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

С должности JSON довольно печати с помощью Gson

в качестве альтернативы, вы можете использовать Джексон, как показано ниже

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

С должности Pretty print JSON in Java (Jackson)

надеюсь, что это поможет!

большинство существующих ответов либо зависят от некоторой внешней библиотеки, либо требуют специальной версии Java. Вот простой код для красивой печати строки JSON, только с использованием общих API Java (доступно в Java 7 для более высокой версии; не пробовал старую версию, хотя).

основная идея состоит в том, чтобы Тиггер форматирование на основе специальных символов в JSON. Например, если наблюдается ' {'или' [ ' , код создаст новую строку и увеличит отступ уровень.

отказ от ответственности: я тестировал это только для некоторых простых случаев 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("  ");
  }
}

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

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)