2014-09-03 4 views
2

Я использую 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 

Любые дальнейшие предложения по этому поводу?

+2

Можете ли вы прояснить, что не удается? Этот вызов с 'Optional.class' работает для меня. –

+0

И какая версия Java. – pickypg

+0

@SotiriosDelimanolis Это странно. Я использую версию 2.3.2 как «Jackson-databind», так и «Jackson-datatype-guava» с Java 7. – RandomQuestion

ответ

0

Интерфейс, который вы вынуждены использовать, низок, ему необходимо поддерживать java.lang.reflect.Type, чтобы разрешить вам передавать общие типы. Затем вы можете использовать jacksons TypeReference (или TypeToken из guava), чтобы получить экземпляр типа Optional.

Смежные вопросы