亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

按類名反序列化json

按類名反序列化json

慕村9548890 2021-08-04 09:49:33
如果我只有我的類的字符串名稱,通過規范名稱調用和對象的 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/在類之前。我不確定這是否可以解決這個問題,但這是有道理的。


查看完整回答
反對 回復 2021-08-04
  • 1 回答
  • 0 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號