2014-09-03 41 views
2

我使用jackson-datatype-guava以及Jackson来处理Guava对象的序列化。它与其他对象一起工作正常,但面临与Optional问题。番石榴与杰克逊的可选序列化

我有一个框架序列化器反序列化器接口,使用下面的方法,我不得不使用。

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。如果我在mapper中使用TypeReferece<Optional<String>>,它可以正常工作,但有没有办法使它在上面的界面上工作?

//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>>(){}); 

更新

我尝试使用2.4。*这些库的版本在意见提出,它的工作罚款Optional<String>但不仍然Optional<MyClass>在哪里工作MyClass是简单的POJO。它似乎反序列化,它认为,MyClass的json是一个映射,并将其转换为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'的调用适用于我。 – 2014-09-03 22:55:01

+0

和哪个版本的Java。 – pickypg 2014-09-03 22:55:27

+0

@SotiriosDelimanolis这很奇怪。我在Java 7中使用了'Jackson-databind'和'Jackson-datatype-guava'的2.3.2版。 – RandomQuestion 2014-09-04 00:15:48

回答

0

您被迫使用的接口很差,它需要支持java.lang.reflect.Type才能允许传递泛型类型。然后,您可以使用JackSons TypeReference(或来自番石榴的TypeToken)来获取可选类型的实例。