2015-02-09 31 views
4

我一直在尋找答案的東西,但我迄今沒有很多運氣。傑克遜反序列化與匿名類

我的問題很簡單:如何正確使用Jackson反序列化匿名對象。

private interface Interface1 
{ 
    int getValue(); 
} 

public static void testAnonymousObject() throws IOException 
{ 
    ObjectMapper mapper = new ObjectMapper(); 

    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 
    mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE); 
    mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 

    Interface1 testObject = new Interface1() 
    { 
     private final int value = 5; 

     @Override 
     public int getValue() 
     { 
      return value; 
     } 
    }; 

    String json = mapper.writeValueAsString(testObject); 
    System.out.println("JSON = " + json); 

    Interface1 received = (Interface1) mapper.readValue(json, Object.class); 
    System.out.println(received); 
} 

的這個輸出是:JSON = [ 「com.foo.test.JacksonTest $ 1」,{ 「值」:5}]之前我得到一個異常:在螺紋

異常「主「com.fasterxml.jackson.databind.JsonMappingException:無法將類com.foo.test.JacksonTest $ 1(類型爲local/anonymous)反序列化爲Bean

編輯爲了澄清,Jackson和XStream都能夠序列化對象。但是隻有XStream似乎能夠將對象反序列化。所以這個場景可以工作。

+1

內部類實例需要構造其外部類的實例。傑克遜會用什麼?它將如何創建外部類實例?頂級類和靜態嵌套類有什麼問題? – 2015-02-09 20:23:09

+0

這裏被序列化/反序列化的對象只是一個空接口的匿名實現。 問題是我正在轉換已經使用XStream序列化的大型代碼庫來使用Jackson。匿名對象在代碼中相當常見。在這種情況下,XStream能夠序列化和反序列化這個對象。傑克遜只能序列化,但不能反序列化。 – sydraz 2015-02-09 20:26:53

回答

6

截至我寫這篇文章時,Jackson似乎沒有正確地序列化內部類或匿名類。但是,其他軟件包,如XStream和Kryo​​,則可以。

+4

你的意思是傑克遜沒有_deserialize_非靜態內部類。支持靜態內部類。 – StaxMan 2015-02-12 07:07:26

+1

是的,我很抱歉不清楚 – sydraz 2015-02-27 18:59:52

0

問題不只是它是一個內部類(其可以是或可以不是問題,取決於實現是靜態的還是非靜態),而且在沒有任何類型的信息被包括 - 所有傑克遜看到的是鍵入Interface1。爲了使其能夠讀回,必須包含類型信息(「多態類型處理」),或者指定抽象類型和實現類之間的映射。

鑑於您使用的是匿名內部類,您可以通過啓用所謂的「默認類型」來支持此用法(請參閱ObjectMapper javadocs for enableDefaultTyping()等)。 但是如果您不想爲所有非最終類型啓用類型包含,您可能還需要實現特定策略。

要查看是否包含類型id,可以使用默認選項之一啓用默認類型,並查看正在生成的JSON:應該有一個額外的類型id(類名稱爲「@class」屬性時用作id )。

+0

我實際上啓用了默認的輸入,這就是爲什麼JSON,也包括在問題中,包含類名稱「com.foo.test.JacksonTest $ 1。但我不知道如何讓序列化的JSON反序列化正確(注意它有正確的類名) – sydraz 2015-02-09 22:56:17

+0

啊,然後問題是匿名內部類不是靜態的,並且需要所謂的「implicit」這個指針,這是不受支持的 – StaxMan 2015-02-12 07:06:15