Java中JSON字符串反序列化(動(dòng)態(tài)泛型)
需求:定時(shí)任務(wù)掃描,反射調(diào)用目標(biāo)對(duì)象,但是,方法的傳參不是固定的。
方案一:將方法參數(shù)存成JSON字符串,然后JSON反序列化成對(duì)象,然后反射調(diào)用
目標(biāo)方法時(shí)這樣的:
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);
實(shí)踐中發(fā)現(xiàn),這兩種方式容易導(dǎo)致OOM
方案二:直接將參數(shù)對(duì)象存到數(shù)據(jù)庫中
數(shù)據(jù)庫對(duì)應(yīng)字段設(shè)置BLOB類型(這里設(shè)置的是MEDIUMBLOB) ,對(duì)應(yīng)的java字段類型是byte[]
// 寫入對(duì)象 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(baseCommandApiDTO); oos.flush(); byte[] data = bos.toByteArray(); // 讀取對(duì)象 ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(entity.getMsgObj())); Object obj = ois.readObject();
最后的最后,優(yōu)化建議:
1、盡量不要在數(shù)據(jù)庫中存json字符串,如果非要存,建議字段類型設(shè)置為json,這樣可以節(jié)省空間。因?yàn)槟銦o法控制json字符串的長度,所以長度設(shè)置是個(gè)問題,另外json反序列化比較占內(nèi)存。
2、長度很大的字段(比如blob類型的)建議單獨(dú)存一張關(guān)聯(lián)表
到此這篇關(guān)于JSON字符串反序列化 動(dòng)態(tài)泛型的文章就介紹到這了,更多相關(guān)JSON字符串反序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用HttpClient模擬POST表單操作應(yīng)用及注意事項(xiàng)
本文主要介紹JAVA中利用HttpClient模擬POST表單操作,希望對(duì)大家有所幫助。2016-04-04Maven項(xiàng)目引用第三方j(luò)ar包找不到類ClassNotFoundException
這篇文章主要為大家介紹了Maven項(xiàng)目引用第三方j(luò)ar包找不到類ClassNotFoundException解決及原因分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Java使用itext生成復(fù)雜數(shù)據(jù)的pdf的示例代碼
Apache iText 是一個(gè)開源 Java 庫,支持 PDF 文檔的開發(fā)和轉(zhuǎn)換,在本教程中,我們將學(xué)習(xí)如何使用 iText 開發(fā)可以創(chuàng)建、轉(zhuǎn)換和操作 PDF 文檔的 Java 程序,感興趣的小伙伴跟著小編一起來看看吧2024-12-12Springboot如何實(shí)現(xiàn)代理服務(wù)器
這篇文章主要介紹了Springboot如何實(shí)現(xiàn)代理服務(wù)器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06