JSON序列化Redis讀取出錯問題解決方案
報錯
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 1, fastjson-version 1.2.44
問題分析
在寫入緩存的時候,hash結(jié)構(gòu),它的value值,在寫入前使用JSON 序列化了,JSON.toJSONString(value)
在取緩存的時候把一個Collection 作為對象序列化了,并不是把List 序列化,所以在反序列化的時候不能用List 來解析
// 讀取緩存返回String
BoundHashOperations<String, String, String> hash = this.template.boundHashOps(key);
Collection list = hash.entries().values();
return JSON.toJSONString(list);// 將String 解析成 List
String tmp = redisService.listHashObject(BOOK_CATALOG);
return JSON.parseArray(tmp, BookCatalog.class);
問題出在這里了,把Collection 轉(zhuǎn)成List 出錯 ,首先強轉(zhuǎn)是不行的
解決
// 讀取緩存直接返回 Collection
BoundHashOperations<String, String, String> hash = this.template.boundHashOps(key);
return hash.entries().values();// 將Collection 轉(zhuǎn)成List,不能直接轉(zhuǎn)成對象,需要先轉(zhuǎn)換成String ,再將單個String 反序列化成對象
java.util.Collection tmp = redisService.listHashObject(BOOK_CATALOG);
List<String> list = new ArrayList<>(tmp);
List<BookCatalog> ans = new ArrayList<>(list.size());
for (String item : list) {
BookCatalog book = JSON.parseObject(item, BookCatalog.class);
ans.add(book);
}//可以再排個序,本身的hash 結(jié)構(gòu)是無序的 ans.sort(Comparator.comparing(BookCatalog::getCode));
return ans;
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java 反射getClass .class 的使用方法示例
這篇文章主要介紹了java 反射getClass .class 的使用方法,結(jié)合實例形式分析了java類反射機制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11解決idea中maven新增的配置文件xx.xml沒生效問題
這篇文章主要介紹了如何解決idea中maven新增的配置文件xx.xml沒生效問題,公司項目有用自己的`私服,Maven正常去私服下載jar包是沒問題的,但阿里云鏡像找不到相關(guān)的jar包報錯,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-06-06Java 讀取、獲取配置文件.properties中的數(shù)據(jù)
這篇文章主要介紹了Java 讀取、獲取配置文件.properties中的數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09RabbitMQ中Confirm消息確認機制保障生產(chǎn)端消息的可靠性詳解
這篇文章主要介紹了RabbitMQ中Confirm消息確認機制保障生產(chǎn)端消息的可靠性詳解,生產(chǎn)者將數(shù)據(jù)發(fā)送到 RabbitMQ 的時候,可能數(shù)據(jù)就在半路給搞丟了,因為網(wǎng)絡問題啥的,都有可能,需要的朋友可以參考下2023-12-12