我使用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
对此有何进一步的建议后?
你能澄清一下失败吗?这个使用'Optional.class'的调用适用于我。 – 2014-09-03 22:55:01
和哪个版本的Java。 – pickypg 2014-09-03 22:55:27
@SotiriosDelimanolis这很奇怪。我在Java 7中使用了'Jackson-databind'和'Jackson-datatype-guava'的2.3.2版。 – RandomQuestion 2014-09-04 00:15:48