通過使用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(尚未確定)
確實,剛剛發現這張票:http://jira.codehaus.org/browse/JACKSON-711 – killy971
啊是的。確保投票支持 - 正如我所說的那樣,它應該能夠工作,但是由於實施方面的原因,這是一個棘手的組合支持方案之一。 – StaxMan