2014-09-03 43 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)來獲取可選類型的實例。