我搜索了很多,只發現關於地圖內部多態反序列化的問題。是否有可能對映射本身進行多態反序列化?是否有可能在傑克遜de /序列化映射本身多態?
例如,我有一個Book類包含一個Map作爲成員變量。
public class Book {
@JsonProperty
private Map<String, Object> reviews;
@JsonCreator
public Book(Map<String, Object> map) {
this.reviews = map;
}
}
另一個類有一個Book類的列表。
public class Shelf {
@JsonProperty
private List<Book> books = new LinkedList<>();
public void setBooks(List<Book> books) {
this.books = books;
}
public List<Book> getBooks() {
return this.books;
}
}
和一個測試類。一本書的評論地圖是一個Hashtable,另一本書的評論地圖是一個HashMap。
public class Test {
private Shelf shelf;
@BeforeClass
public void init() {
Map<String, Object> review1 = new Hashtable<>(); // Hashtable here
review1.put("test1", "review1");
Map<String, Object> review2 = new HashMap<>(); // HashMap here
review2.put("test2", "review2");
List<Book> books = new LinkedList<>();
books.add(new Book(review1));
books.add(new Book(review2));
shelf = new Shelf();
shelf.setBooks(books);
}
@Test
public void test() throws IOException{
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
// mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
String json = mapper.writeValueAsString(shelf);
System.out.println(json);
Shelf sh = mapper.readValue(json, Shelf.class);
for (Book b : sh.getBooks()) {
System.out.println(b.getReviews().getClass());
}
}
}
測試輸出
{
"name" : "TestShelf",
"books" : [ {
"reviews" : {
"test1" : "review1"
}
}, {
"reviews" : {
"test2" : "review2"
}
} ]
}
class java.util.LinkedHashMap
class java.util.LinkedHashMap
序列化工作正常。但是在反序列化之後,review1和review2都是LinkedHashMap。我希望review1和review2是它們的實際類型,它們是Hashtable來審查1和HashMap來審查2。有什麼辦法可以做到這一點?
我不想使用mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
,因爲它會爲json消息中的所有json屬性添加類型信息。如果還有更好的方法,我也不想使用定製的解串器。提前致謝。
非常感謝您的回覆。我實際上正在重新設計遺留代碼以將其置於RESTful API之後。代碼的一部分與我發佈的代碼具有相似的結構。它有自己的Map實現,它擴展了Hashtable。它重寫get()方法總是返回地圖中值的字符串表示。如果我將它留給Jackson的默認LinkedHashMap,則get()方法將返回Integer(如果該值爲Integer),這將打破代碼的功能。 –