Я использую jackson-datatype-guava вместе с Jackson
для обработки сериализации Guava
объектов. Все работает отлично с другими объектами, но сталкивается с проблемой с Optional
.Guava Дополнительная сериализация с Jackson
У меня есть интерфейс десериализатора сериализатора из рамки со следующими методами, которые я вынужден использовать.
String toJson(Object object);
<T> T fromJson(String json, Class<T> valueType);
Это означает, что мой Jackson
реализацию этого интерфейса, который использует ObjectMapper
также можно использовать только после метода на картографа.
mapper.readValue(json, valueType);
который не работает в случае необходимости.
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new GuavaModule());
mapper.readValue(mapper.writeValueAsString(Optional.of("string")), Optional.class);
Это сообщение ошибки Null JavaType passed
. Если я использую TypeReferece<Optional<String>>
в mapper, он отлично работает, но есть ли способ заставить его работать с вышеуказанным интерфейсом?
//works fine but can't use this method as interface only accepts `Class` param.
mapper.readValue(mapper.writeValueAsString(Optional.of("string")), new TypeReference<Optional<String>>(){});
Update
Я попытался с помощью 2.4. * Версии этой библиотеки, как предложено в комментариях, и это работает прекрасно для Optional<String>
, но не все еще работает для Optional<MyClass>
где MyClass
просто POJO. Похоже, что десериализация, считает он, json MyClass
- это карта и преобразует ее в Optional<Map>
.
public class MyClass {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Основная программа:
MyClass obj = new MyClass();
obj.setName("PAC");
Optional<MyClass> obj1 = mapper.readValue(mapper.writeValueAsString(Optional.of(obj)), Optional.class);
System.out.println(obj1); //prints as Map
System.out.println(obj1.get().getName()); //Fails doing casting to MyClass
Выход:
Exception in thread "main" Optional.of({name=PAC})
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyClass
at OptionalTest.main(OptionalTest.java:22)
Я также попытался позволяет печатать по умолчанию в картографа по mapper.enableDefaultTyping()
, но без удачи.
Ошибка при mapper.readValue...
линии после включения по умолчанию ввод для DefaultTyping.NON_FINAL
Invalid type id 'MyClass' (for id type 'Id.class'): Class MyClass is not assignable to com.google.common.base.Optional
Любые дальнейшие предложения по этому поводу?
Можете ли вы прояснить, что не удается? Этот вызов с 'Optional.class' работает для меня. –
И какая версия Java. – pickypg
@SotiriosDelimanolis Это странно. Я использую версию 2.3.2 как «Jackson-databind», так и «Jackson-datatype-guava» с Java 7. – RandomQuestion