CoreData - это собственная система сохранения и, в соответствии с его тщательной документацией, вы должны использовать назначенные им инициализаторы и следовать определенному пути к созданию и хранению объектов с ней.
Вы все равно можете использовать Codable
с этим ограничены, как вы можете использовать NSCoding
.
Одним из способов является декодирование объекта (или структуры) с помощью любого из этих протоколов и перенос его свойств в новый экземпляр NSManagedObject
, который вы создали для документов Core Data.
Другой способ (который очень распространен) - использовать один из протоколов только для нестандартного объекта, который вы хотите сохранить в свойствах управляемого объекта. Под «нестандартным» я имею в виду все, что не соответствует стандартным типам атрибутов Core Data, как указано в вашей модели. Например, NSColor
не может быть сохранен непосредственно как свойство управляемого объекта, поскольку он не является одним из базовых типов CD-носителей. Вместо этого вы можете использовать NSKeyedArchiver
для сериализации цвета в экземпляре NSData
и сохранить его как свойство Data в управляемом объекте. Переверните этот процесс с помощью NSKeyedUnarchiver
. Это упрощенно, и с Core Data намного лучший способ сделать это (см. Атрибуты переходных процессов ), но это иллюстрирует мою точку зрения.
Вы также могли бы принять Encodable
(один из двух протоколов, которые составляют Codable
- можете ли вы угадать имя другого?), чтобы преобразовать экземпляр управляемого объекта непосредственно в JSON для совместного использования, но вы 'd иметь указать ключи кодирования и собственную собственную реализацию encode
, поскольку она не будет автоматически синтезирована компилятором с помощью пользовательских ключей кодирования. В этом случае вы хотите указать только ключи (свойства), которые вы хотите включить.
Надеюсь, это поможет.
Моя ситуация заключается в том, что мой проект использует устаревший (не 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");
Большинство существующих ответов либо зависят от некоторой внешней библиотеки, либо требуют специальной версии 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(" ");
}
}
Достаточно печатать с помощью GSON в одной строке:
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(jsonString)));
Помимо включения, это эквивалентно принятому ответу .
Вы можете использовать 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)
Надейтесь на эту помощь!
Я использовал org.json встроенные методы для правильной печати данных.
JSONObject json = new JSONObject(jsonString); // Convert text to object
System.out.println(json.toString(4)); // Print it with specified indentation
Порядок полей в JSON является случайным для каждого определения. Конкретный порядок зависит от реализации парсера.
scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
– Agnes
19 March 2015 в 09:31
Следуя спецификациям 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;
}
}
В одной строке:
String niceFormattedJson = JsonWriter.formatJson(jsonString)
json-io libray ( https://github.com/jdereg/json-io ) является небольшой (75K) библиотека без каких-либо других зависимостей, чем JDK.
В дополнение к довольно-печатной JSON вы можете сериализовать объекты Java (целые графические объекты Java-графики с циклами) в JSON, а также прочитать их.
Это работало для меня, используя Джексона:
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)
С Jackson (com.fasterxml.jackson.core
):
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject))
From: Как включить довольно печатный вывод JSON (Jackson)
Я знаю это уже в ответах, но я хочу написать его отдельно здесь, потому что, скорее всего, у вас уже есть Джексон как зависимость, и поэтому все, что вам понадобится, будет дополнительной строкой кода