Pretty-Print JSON в Java

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

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

Ответ 1

GSON может сделать это красиво:

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

Ответ 2

Я использовал org.json встроенные методы для точной печати данных.

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

Порядок полей в JSON является случайным для определения. Конкретный порядок зависит от реализации парсера.

Ответ 3

Кажется, что GSON поддерживает это, хотя я не знаю, хотите ли вы переключиться с библиотеки, которую используете.

Из руководства пользователя:

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

Ответ 4

Если вы используете реализацию Java API для JSON Processing (JSR-353), тогда вы можете указать свойство 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();

Ответ 5

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

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

От: Как включить вывод в формате JSON для симпатичной печати (Джексон)

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Из Javadoc:

Ответ 10

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

String niceFormattedJson = JsonWriter.formatJson(jsonString)

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

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

Ответ 11

Теперь это может быть достигнуто с помощью библиотеки 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>

Ответ 12

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

}

Ответ 13

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

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

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

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

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

Из сообщения Довольно печатать JSON в Java (Джексон)

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

Ответ 14

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

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)

Ответ 15

В Underscore-java есть статический метод U.formatJson(json). Я поддерживаю проект. Живой пример

import com.github.underscore.lodash.U;

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

Выход:

{
   "Price": {
      "LineItems": {
         "LineItem": {
            "UnitOfMeasure": "EACH",
            "Quantity": 2,
            "ItemID": "ItemID"
         }
      },
      "Currency": "USD",
      "EnterpriseCode": "EnterpriseCode"
   }
}