這是我的冷杉titme處理類型映射和每次我嘗試將節點映射到具有與Set<Integer>
值自定義屬性鍵FooType我的實際類型對象。這裏是我的對象看起來像的Json傑克遜映射通用映射類型問題
public class Foo {
private String some;
Map<FooTypes,Set<Integer>> foos;
public Map<FooTypes, Set<Integer>> getFoos() {
return foos;
}
public void setFoos(Map<FooTypes, Set<Integer>> map) {
this.foos = map;
}
public String getSome() {
return some;
}
public void setSome(String some) {
this.some = some;
}
}
public class FooTypes {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
現在每次我嘗試使用映射器讀取值: -
List <Foo> response = mapper.readValue("/home/foo/foo.json",List.class);
我得到一個錯誤,指出: -
Can not find a (Map) Key deserializer for type [simple type, class cruft.FooTypes]
有人能告訴我如何解決這個問題?謝謝。
JSON輸出: -
{"foos":{"FooTypes [id=1, name=Test Foo]":[1,2,3]},"some":hello},{"foos":{"FooTypes [id=2, name=Another foo]":[5,6,7]}}
我採納了你的建議,並使用更加清潔的靜態工廠方法。它有點不好意思,我不得不substring的(字符串)鍵,所以我可以設置適當的FooTypes值到我的對象,然後從工廠方法返回它。 –
當我嘗試在我的靜態工廠方法中返回mapper.readValue(key,FooTypes.class)時,我得到構造Key類型的異常。所以我去了骯髒的方式和substring的關鍵,得到的價值觀,然後將其設置在我的對象。還有其他方法可以完成嗎?這似乎有點hacky –
你不能在靜態工廠中使用ObjectMapper(請參閱http://stackoverflow.com/questions/12106552/json-weired-key-exception/12112508#12112508)。不,沒有其他方法,這是JSON的限制。你的JSON可能看起來像{「name-id1」:「somefoo」,「name-id2」:someotherfoo「};只要你有一個String形式的FooType的正式表示,應該不會有問題。 –