как красиво печатать json string [duplicate]

CoreData - это собственная система сохранения и, в соответствии с его тщательной документацией, вы должны использовать назначенные им инициализаторы и следовать определенному пути к созданию и хранению объектов с ней.

Вы все равно можете использовать Codable с этим ограничены, как вы можете использовать NSCoding.

Одним из способов является декодирование объекта (или структуры) с помощью любого из этих протоколов и перенос его свойств в новый экземпляр NSManagedObject, который вы создали для документов Core Data.

Другой способ (который очень распространен) - использовать один из протоколов только для нестандартного объекта, который вы хотите сохранить в свойствах управляемого объекта. Под «нестандартным» я имею в виду все, что не соответствует стандартным типам атрибутов Core Data, как указано в вашей модели. Например, NSColor не может быть сохранен непосредственно как свойство управляемого объекта, поскольку он не является одним из базовых типов CD-носителей. Вместо этого вы можете использовать NSKeyedArchiver для сериализации цвета в экземпляре NSData и сохранить его как свойство Data в управляемом объекте. Переверните этот процесс с помощью NSKeyedUnarchiver. Это упрощенно, и с Core Data намного лучший способ сделать это (см. Атрибуты переходных процессов ), но это иллюстрирует мою точку зрения.

Вы также могли бы принять Encodable (один из двух протоколов, которые составляют Codable - можете ли вы угадать имя другого?), чтобы преобразовать экземпляр управляемого объекта непосредственно в JSON для совместного использования, но вы 'd иметь указать ключи кодирования и собственную собственную реализацию encode, поскольку она не будет автоматически синтезирована компилятором с помощью пользовательских ключей кодирования. В этом случае вы хотите указать только ключи (свойства), которые вы хотите включить.

Надеюсь, это поможет.

155
задан Francesco Menzani 11 September 2015 в 14:35
поделиться

10 ответов

218
ответ дан Francesco Menzani 31 October 2018 в 17:27
поделиться

Моя ситуация заключается в том, что мой проект использует устаревший (не 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");
14
ответ дан Agnes 20 August 2018 в 22:26
поделиться
  • 1
    Это потрясающе, используйте js-движок, чтобы сделать это, намного проще – med116 6 November 2015 в 00:53

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

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

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

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

16
ответ дан Community 20 August 2018 в 22:26
поделиться

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

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

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

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

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

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

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

3
ответ дан David Pham 20 August 2018 в 22:26
поделиться

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

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

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

105
ответ дан Francesco Menzani 20 August 2018 в 22:26
поделиться
  • 1
    Проблема с GSON, сложная, json-simple намного проще. – mabuzer 5 November 2010 в 13:40
  • 2
    Я не рассматриваю эту проблему более года, но если вы хотите немного изменить исходный код, code.google.com/p/json-simple/issues/detail?id=22 содержит некоторую информацию об улучшении json-simple с довольно-печатной печатью. – BuffaloBuffalo 23 November 2011 в 15:22
  • 3
    Ну, я включил код для синтаксического анализа строки в JsonElement, как правило, у вас уже есть предыдущая работа с данными JSON. Но я хотел включить его здесь, чтобы сделать использование более понятным. – Ray Hulha 20 February 2014 в 17:01
  • 4
    Поскольку этот ответ помог мне. Я добавил код ниже, чтобы уменьшить это утверждение до меньшего количества строк, если это то, что вы ищете. public String prettifyJson (String json) {JsonElement jsonElement = new JsonParser (). parse (json); return new GsonBuilder (). setPrettyPrinting (). create (). toJson (jsonElement); } – ahmad 11 February 2015 в 19:50
  • 5
    На вопрос OP можно ответить без дополнительных библиотек, поскольку вы можете просто получить доступ к парсеру JSON, встроенному в Rhino (JDK 1.7 и выше). Я не думаю, что желательно добавить библиотеку в проект, чтобы отформатировать какой-то вывод отладки. scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)"); – Agnes 19 March 2015 в 09:31
  • 6
    Хотя эта библиотека может помочь ответить на вопрос, было бы лучше включить пример example того, как он применим к проблеме с некоторым объяснением относительно того, как это работает. – Francesco Menzani 11 September 2015 в 15:51
  • 7
    Хорошо спасибо за отзывы. Хотя помните, такие люди, как я, являются добровольцами, и им не платят за предоставление услуги, которая гарантирует соответствие стандартам качества. У нас ограниченное время, потому что мы часто находимся в середине работы или выполняем семейные обязанности. Вот почему & quot; редактировать & quot; доступно читателям, поэтому мы можем сделать сообщения друг друга более полезными. – Sridhar-Sarnobat 24 August 2016 в 19:41
  • 8
    Я также предпочитаю это решение, потому что вам не нужно импортировать дополнительные зависимости, как предлагают другие ответы. – gdrt 3 February 2017 в 13:17
  • 9
    В отличие от альтернативы org.json, метод GSON довольно печатной формы сохраняет порядок элементов без изменений после преобразования. – Aydin K. 5 July 2017 в 13:25
  • 10
    Получил просто строку без какого-либо красивого форматирования печати :( – Cherry 25 July 2017 в 07:10
  • 11
    он печатает строку с\r\n – Stone Jack 17 November 2017 в 13:14
  • 12
    Проверьте мой ответ на другой связанный вопрос, если вы заинтересованы в более общем решении, например, при регистрации. – pirho 16 December 2017 в 14:31
  • 13
    – testerjoe2 19 October 2018 в 03:16

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

}
3
ответ дан Jens Piegsa 20 August 2018 в 22:26
поделиться

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

String niceFormattedJson = JsonWriter.formatJson(jsonString)

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

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

5
ответ дан John DeRegnaucourt 20 August 2018 в 22:26
поделиться

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

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)
0
ответ дан ObiWanKenobi 20 August 2018 в 22:26
поделиться

С Jackson (com.fasterxml.jackson.core):

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

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

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

9
ответ дан oktieh 20 August 2018 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: