2011-12-01 63 views
6

通過使用Jackson json庫,可以通過使用@JsonCreator反序列化對象,並獲得表示輸入json的「頂級」地圖,如下所示:在頂層地圖上使用帶@JsonCreator的@JacksonInject

class MyClass { 
    final int field; 

    @JsonCreator 
    public MyClass(Map<String, Object> map) { 
     this.field = (int) map.get("theInt"); 
    } 
} 

或甚至在一個靜態工廠方法:

class MyClass { 
    final int field; 

    public MyClass(int theInt) { 
     this.field = theInt; 
    } 

    @JsonCreator 
    static MyClass create(Map<String, Object> map) { 
     return new MyClass((int) map.get("theInt")); 
    } 
} 

前面的例子可以處理以下種類JSON輸入的:

{ 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3" 
} 

這在我的情況下特別有用,因爲我想反序列化一個json結構,我不知道。被賦予訪問權限,我稱之爲「頂級地圖」使事情變得簡單。

我想反序列化我的對象這樣的方式,因爲它也可以代替使用@JsonAnySetter它不允許它來創建不可變對象,和@JsonProperty我不能使用,因爲我不知道屬性名稱就像我之前提到的那樣。

接下來,我想在我的工廠方法中注入一些配置,並且Jackson允許通過使用@JacksonInject和致電上的withInjectableValues(InjectableValues)

這是最終的那種代碼,我想用:

class MyClass { 
    final MyField[] myFields; 

    public MyClass(MyField... myFields) { 
     this.myFields = myFields; 
    } 

    @JsonCreator 
    static MyClass create(@JacksonInject("conf") Conf conf, Map<String, Object> map) { 
     MyFields[] myFields; 
     // initialize myFields (or any other object) based on the content of map 
     // and also make use of the inject conf 
     return new MyClass(myFields); 
    } 
} 

不幸的是,傑克遜拋出以下類型的異常:在構造嘗試的伎倆時

JsonMappingException: Argument #1 of constructor [constructor for MyClass, annotations: {[email protected]()}] has no property name annotation; must have name when multiple-paramater constructor annotated as Creator

  • 努力把戲當上了工廠方法

JsonMappingException: Argument #1 of factory method [method create, annotations: {[email protected]()}] has no property name annotation; must have when multiple-paramater static method annotated as Creator

有誰知道我怎麼能解決問題呢?

綜上所述的要求,我需要:

  • 進入頂級地圖(不知道提前JSON屬性名)
  • 創建一個不可變對象(所以不能使用@JsonAnySetter
  • 注入一些的conf到@JsonCreator裝飾構造函數或工廠方法

我不能改變JSON輸入格式,它看起來像這樣:

{ 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3" 
} 

[編輯]

這是一個已知的問題:http://jira.codehaus.org/browse/JACKSON-711(尚未確定)

回答

4

正確的,你想都使用 「委託」 的創造者(一個參數,成JSON輸入是首次綁定的) - 與「基於屬性」的創建者不同,在該創建者中傳遞了一組命名參數 - 以及可注入的值。這應該是理想的工作,但我認爲它目前可能無法工作。 我想這裏有一個Jira輸入,所以你可以查看它(http://jira.codehaus.org/browse/JACKSON)。

只是爲了確保:您使用的版本是1.9.2嗎?自1.9.0以來,已有一些修復;至少會給出更好的錯誤信息。

+0

確實,剛剛發現這張票:http://jira.codehaus.org/browse/JACKSON-711 – killy971

+0

啊是的。確保投票支持 - 正如我所說的那樣,它應該能夠工作,但是由於實施方面的原因,這是一個棘手的組合支持方案之一。 – StaxMan

相關問題