2015-11-09 130 views
3

我有我認爲應該是一個簡單的用例。傑克遜反序列化到具體類基於類型

我想用類型元數據(最好是一個簡單的名字,而不是完全合格的類/包名稱)序列化一個POJO,然後讓Jackson將該JSON反序列化爲它來自的具體類使用這個元數據。序列化和反序列化的類之間沒有繼承層次結構。

我的場景是我有一個接受多種文件類型的服務。對於上傳的每個文件,客戶端可以檢索其結構和類型取決於其來自的文件的JSON數據。因此,當我從服務中獲取JSON時,不知道具體的類將被反序列化到什麼地方。我希望傑克遜根據它提供的元數據來判斷。

例如,我希望能夠做到這一點:

String json = ... // get JSON from the service 
Object obj = mapper.readValue(json, Object.class) // concrete class is not known 
System.out.println(obj.getClass()) // I want this to be MyConcreteClass.class 
  • 有JSON類型之間沒有繼承層次返回。
  • 我不想透露軟件包名稱或其他內部服務 details/structure。
  • 我能控制的傑克遜的序列化過程

相關問題:Can jackson determine root object type to deserialize to when json includes type property?

非常感謝你的幫助!

回答

0

這可以使用傑克遜的JavaType來實現:

String className = "class.name.from.json.service"; 
JavaType dtoType = TypeFactory.defaultInstance().constructFromCanonical(className); 
Object dto = new ObjectMapper().readValue(InputStream, dtoType); 
assert dto.getClass().equals(dtoType.getRawClass());