Java中JSON字符串反序列化(動態(tài)泛型)
需求:定時任務掃描,反射調用目標對象,但是,方法的傳參不是固定的。
方案一:將方法參數(shù)存成JSON字符串,然后JSON反序列化成對象,然后反射調用
目標方法時這樣的:
CommandResp sendXXX(BaseCommandApiDTO<XXX> baseCommandApiDTO);
方式一:FastJson
Class mainBody = Class.forName(entity.getMainBodyType());
ParameterizedTypeImpl parameterizedType = new ParameterizedTypeImpl(new Type[]{mainBody}, null, BaseCommandApiDTO.class);
Object obj = JSON.parseObject(entity.getMsgText(), parameterizedType);
CommandResp resp = ReflectUtil.invoke(serviceObj, methodName, obj);方式二:Jackson
public class ObjectMapperHolder {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static ObjectMapper getObjectMapper() {
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JavaTimeModule());
return objectMapper;
}
}
ObjectMapper mapper = ObjectMapperHolder.getObjectMapper();
JavaType javaType = mapper.getTypeFactory().constructParametricType(BaseCommandApiDTO.class, mainBody);
Object obj = mapper.readValue(entity.getMsgText(), javaType);
CommandResp resp = ReflectUtil.invoke(serviceObj, methodName, obj);實踐中發(fā)現(xiàn),這兩種方式容易導致OOM
方案二:直接將參數(shù)對象存到數(shù)據(jù)庫中
數(shù)據(jù)庫對應字段設置BLOB類型(這里設置的是MEDIUMBLOB) ,對應的java字段類型是byte[]
// 寫入對象 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(baseCommandApiDTO); oos.flush(); byte[] data = bos.toByteArray(); // 讀取對象 ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(entity.getMsgObj())); Object obj = ois.readObject();
最后的最后,優(yōu)化建議:
1、盡量不要在數(shù)據(jù)庫中存json字符串,如果非要存,建議字段類型設置為json,這樣可以節(jié)省空間。因為你無法控制json字符串的長度,所以長度設置是個問題,另外json反序列化比較占內(nèi)存。
2、長度很大的字段(比如blob類型的)建議單獨存一張關聯(lián)表
到此這篇關于JSON字符串反序列化 動態(tài)泛型的文章就介紹到這了,更多相關JSON字符串反序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java利用HttpClient模擬POST表單操作應用及注意事項
本文主要介紹JAVA中利用HttpClient模擬POST表單操作,希望對大家有所幫助。2016-04-04
Maven項目引用第三方jar包找不到類ClassNotFoundException
這篇文章主要為大家介紹了Maven項目引用第三方jar包找不到類ClassNotFoundException解決及原因分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
Java使用itext生成復雜數(shù)據(jù)的pdf的示例代碼
Apache iText 是一個開源 Java 庫,支持 PDF 文檔的開發(fā)和轉換,在本教程中,我們將學習如何使用 iText 開發(fā)可以創(chuàng)建、轉換和操作 PDF 文檔的 Java 程序,感興趣的小伙伴跟著小編一起來看看吧2024-12-12

