Я пытаюсь использовать Джексон как универсальный механизм сериализации вместо сериализации Java. инициализацией картографа следующим образом:Deserializing Java массивы с Jackson
objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
Все виды информации в хранятся в формате JSON, так что я в состоянии читать и писать все свои объекты обратно с:
objectMapper.readValue(json, Object.class)
Я имею проблемы при попытке сериализации, а затем десериализации java-массивов. Поскольку Jackson не сохраняет тип массива в JSON, он не работает на этапе десериализации. В следующем коде:
String [] strings = {"A", "B", "C"};
try {
String json = objectMapper.writeValueAsString(strings);
String [] stringsBack = (String [])objectMapper.readValue(json, Object.class);
if (!strings.equals(stringsBack)) {
System.err.println("ERROR, stringsBack not the same!!!\n\n");
}
} catch (IOException e) {
e.printStackTrace();
}
JSON будет установлен на "[" A " "B", "C"]", но на десериализации я получаю следующее исключение:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid type id 'A' (for id type 'Id.class'): no such class found
at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:66)
at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:48)
at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:157)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:94)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromAny(AsArrayTypeDeserializer.java:68)
at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserializeWithType(UntypedObjectDeserializer.java:494)
at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:42)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3560)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2576)
at Main.run(Main.java:86)
Есть способ проинструктировать Джексона хранить информацию о типах массивов java, а также в JSON? Мой механизм сериализации является общим и не знает заранее, какой тип он будет читать из строки JSON.
Есть ли причина, что вы не используете 'objectMapper.readValue (JSON, String [] класс.)'? Вы сказали Джексону десериализовать объект, и, конечно, он понятия не имеет, какой тип объекта он имеет. – immibis
Причина в том, что мне нужно иметь возможность хранить и читать объекты из строк без дополнительного знания их типа. Для всех остальных сценариев он работает, поскольку имена классов хранятся в JSON. Я ищу флаг, который даст указание Джексону хранить типы массивов java в строке, а затем он сможет найти этот тип сам по себе. –