1. 程式人生 > >使用Redis和jackson操作json中遇到的坑

使用Redis和jackson操作json中遇到的坑

表數據 谷歌 這樣的 進行 結構 length 找到 sql 報道

  前言(可以略過)

  最近在開發一個智能電表的管理系統,與常規的面向業務的系統不同。智能電表特點是每30分鐘會向服務器發一次請求,報道自己目前的電表情況。然後服務器根據電表情況統計此電表的電量使用情況,包括日,月,年。不同的小區還有不同的階梯峰谷電計算策略。不同的繳費時間(需要根據繳費時間生成對應的訂單)。並且電表初期預計有10w個,這樣就又帶來了高並發的問題。

  所以此系統主要難點就是實時電量的統計以及高並發。

  經過一系列的討論,終於找到了解決方案:通過redis來對所有的電表數據進行緩存,然後一天進行一次持久化,這樣的話就可以減少mysql的壓力,但弊端就是redis的數據結構會比較復雜。

  正文(問題描述)

  在用redis存儲獲取數據時,發現從redis存入的json字符串無法使用jackson進行對象轉換。一開始以為是jackson的使用問題,然後又是看谷歌又是看文檔,發現都無法解決。最終debug發現了問題如下:

  當把一個對象轉換成Json字符串存入redis中,然後再從redis取出時是這樣的格式

要轉換的對象
class A{
    int consumeStep=0;
    float totalAmount=0f;
}

從redis中取出後的數據格式:

"{\"consumeStep\":1,\"totalAmount\":0.0}"

可以發現,字符串進行了轉義處理。

如果直接把轉義的字符串顯式賦值給一個變量,編譯器會自動把轉義字符去除,變成一個正常的json字符:

技術分享圖片

如果不是顯式賦值的,那麽原來的轉義字符以及開頭和結束的雙引號都會存在

技術分享圖片

如果上面的格式想通過顯式賦值,要怎麽實現呢?需要把每一個轉義字符再次轉義如下:

String c="\"{\\\"consumeStep\\\":1,\\\"totalAmount\\\":0.0}\"";

技術分享圖片

那麽問題也就解決了,因為不是顯式賦值的原因,所以從redis中獲取的json字符串會出現多余的雙引號和轉義字符,造成jackson無法識別解析,解決方法就是把多余的字符去掉:

str=str.substring(1, structureString.length()-1);//去掉開頭和結尾的雙引號
str=str.replace("\\", "");//去掉轉義字符

暫時只能想到這個方法,有更牛方法的同學歡迎留言,一起學習,謝謝。

使用Redis和jackson操作json中遇到的坑