如果我只有我的類的字符串名稱,通過規范名稱調用和對象的 json 字符串表示,我如何從 json 字符串反序列化我的對象?換句話說,我需要這樣的方法:public <T> T deserialize(String json, String className) { // some code}我們有類名和 json 字符串 - 我們需要將 json 反序列化為 java 對象。如果我知道對象的類,我知道如何將 json 反序列化為對象,例如,我們可以使用Jackson:String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";Car car = objectMapper.readValue(json, Car.class); 但是在我的任務中有一個不同的類 - 它可能是Cat.class,Dog.class,Car.class等等。每個類都有不同的狀態。我需要通用的反序列化方法。我寫的是這樣的:public final class Utils implements Serializable { private Utils () { throw new AssertionError(); } private static ObjectMapper objectMapper = new ObjectMapper(); public static String toJson(Object obj) { String objectToJson; try { objectToJson = objectMapper.writeValueAsString(obj); } catch (JsonProcessingException e) { throw new UncheckedIOException(String.format("Can't serialize object %s to JSON string", obj), e); } return objectToJson; } public static <T> T fromJson(String json, String className) throws ClassNotFoundException, IOException { Class<?> clz = Class.forName(className); return (T) objectMapper.readValue(json, clz); }}它適用于上面的汽車示例,但帶有警告cast exception。但也許有更好的方法?哦,并不是所有的對象都會如此簡單。其中一些將封裝集合和其他對象。
1 回答

九州編程
TA貢獻1785條經驗 獲得超4個贊
問題源于編譯器想要(實際上)為使用它的每個類型 T 制作此方法的不同實例。然而,在爭論中沒有任何東西可以掛起它的帽子。
如果調用者不知道期望什么類,除了該類的 String 表示(我假設它也已保存在 JSON 中?),他將如何處理此調用的結果?由于他不知道,他必須將它用作簡單的 Object,在這種情況下,該方法還不如簡單地返回 Object。
如果調用者確實知道這個類,那么他可以傳入一個 Class 作為參數,你不會有任何問題。
我在寫這篇文章時突然想到,ObectMapper 的某些 readValue 方法必須有類似的問題,例如接受 ResolvedType 而不是 Class 的方法。我注意到,在該類的源代碼中,它包含/unchecked/
在類之前。我不確定這是否可以解決這個問題,但這是有道理的。
添加回答
舉報
0/150
提交
取消