我使用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