日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一個詭異的Json反序列化問題

來源: 責編: 時間:2024-06-28 17:16:02 254觀看
導讀前言最近我在做知識星球中的商品秒殺系統,昨天遇到了一個詭異的json反序列化問題,感覺挺有意思的,現在拿出來跟大家一起分享一下,希望對你會有所幫助。案發現場我最近在做知識星球中的商品秒殺系統,寫了一個filter,獲取用戶

前言

最近我在做知識星球中的商品秒殺系統,昨天遇到了一個詭異的json反序列化問題,感覺挺有意思的,現在拿出來跟大家一起分享一下,希望對你會有所幫助。a6G28資訊網——每日最新資訊28at.com

案發現場

我最近在做知識星球中的商品秒殺系統,寫了一個filter,獲取用戶請求的header中獲取JWT的token信息。a6G28資訊網——每日最新資訊28at.com

然后根據token信息,獲取到用戶信息。a6G28資訊網——每日最新資訊28at.com

在轉發到業務接口之前,將用戶信息設置到用戶上下文當中。a6G28資訊網——每日最新資訊28at.com

這樣接口中的業務代碼,就能通過用戶上下文,獲取到當前登錄的用戶信息了。a6G28資訊網——每日最新資訊28at.com

我們的token和用戶信息,為了性能考慮都保存到了Redis當中。a6G28資訊網——每日最新資訊28at.com

用戶信息是一個json字符串。a6G28資訊網——每日最新資訊28at.com

當時在用戶登錄接口中,將用戶實體,使用fastjson工具,轉換成了字符串:a6G28資訊網——每日最新資訊28at.com

JSON.toJSONString(userDetails);

保存到了Redis當中。a6G28資訊網——每日最新資訊28at.com

然后在filter中,通過一定的key,獲取Redis中的字符串,反序列化成用戶實體。a6G28資訊網——每日最新資訊28at.com

使用的同樣是fastjson工具:a6G28資訊網——每日最新資訊28at.com

JSON.parseObject(json, UserEntity.class);

但在反序列化的過程中,filter拋異常了:com.alibaba.fastjson.JSONException: illegal identifier : /pos 1, line 1, column 2{/"accountNonExpired/":true,/"accountNonLocked/":true,/"authorities/":[{/"authority/":/"admin/"}],/"credentialsNonExpired/":true,/"enabled/":true,/"id/":13,/"password/":/"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe/",/"roles/":[/"admin/"],/"username/":/"admin/"}a6G28資訊網——每日最新資訊28at.com

2 分析問題

我剛開始以為是json數據格式有問題。a6G28資訊網——每日最新資訊28at.com

將json字符串復制到在線json工具:https://www.sojson.com,先去掉化之后,再格式數據,發現json格式沒有問題:a6G28資訊網——每日最新資訊28at.com

圖片圖片a6G28資訊網——每日最新資訊28at.com

然后寫了一個專門的測試類,將日志中打印的json字符串復制到json變量那里,使用JSON.parseObject方法,將json字符串轉換成Map對象:a6G28資訊網——每日最新資訊28at.com

public class Test {    public static void main(String[] args) {        String json = "{/"accountNonExpired/":true,/"accountNonLocked/":true,/"authorities/":[{/"authority/":/"admin/"}],/"credentialsNonExpired/":true,/"enabled/":true,/"id/":13,/"password/":/"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe/",/"roles/":[/"admin/"],/"username/":/"admin/"}";        Map map = JSON.parseObject(json, Map.class);        // 輸出解析后的 JSON 對象        System.out.println(map);    }}

執行結果:a6G28資訊網——每日最新資訊28at.com

{password=$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe, credentialsNnotallow=true, roles=["admin"], accountNnotallow=true, id=13, authorities=[{"authority":"admin"}], enabled=true, accountNnotallow=true, username=admin}

竟然轉換成功了。a6G28資訊網——每日最新資訊28at.com

這就讓我有點懵逼了。。。a6G28資訊網——每日最新資訊28at.com

為什么相同的json字符串,在Test類中能夠正常解析,而在filter當中卻不行?a6G28資訊網——每日最新資訊28at.com

當時怕搞錯了,debug了一下filter,發現獲取到的json數據,跟Test類中的一模一樣:a6G28資訊網——每日最新資訊28at.com

圖片圖片a6G28資訊網——每日最新資訊28at.com

帶著一臉的疑惑,我做了下面的測試。a6G28資訊網——每日最新資訊28at.com

莫非是反序列化工具有bug?a6G28資訊網——每日最新資訊28at.com

3 改成gson工具

我嘗試了一下將json的反序列化工具改成google的gson,代碼如下:a6G28資訊網——每日最新資訊28at.com

Map map = new Gson().fromJson(userJson, Map.class);

運行之后,報了一個新的異常:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $a6G28資訊網——每日最新資訊28at.com

這里提示json字符串中包含了:$。a6G28資訊網——每日最新資訊28at.com

而$是特殊字符,password是做了加密處理的,里面包含$和.,這兩種特殊字符。a6G28資訊網——每日最新資訊28at.com

為了快速解決問題,我先將這兩個特字符替換成空字符串:a6G28資訊網——每日最新資訊28at.com

json = json.replace("$","").replace(".","");

日志中打印出的json中的password,已經不包含這兩個特殊字符了:a6G28資訊網——每日最新資訊28at.com

2a10o3XfeGr0SHStAwLuJRW6ykE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe

但調整之后代碼報了下面的異常:com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.a6G28資訊網——每日最新資訊28at.com

跟剛剛有點區別,但還是有問題。a6G28資訊網——每日最新資訊28at.com

4 改成jackson工具

我又嘗試了一下json的反序列化工具,改成Spring自帶的的jackson工具,代碼如下:a6G28資訊網——每日最新資訊28at.com

ObjectMapper objectMapper = new ObjectMapper();try {    Map map = objectMapper.readValue(json, Map.class);} catch (JsonProcessingException e) {    e.printStackTrace();}

調整之后,反序列化還是報錯:com.fasterxml.jackson.core.JsonParseException: Unexpected character ('/' (code 92)): was expecting double-quote to start field namea6G28資訊網——每日最新資訊28at.com

3種反序列化工具都不行,說明應該不是fastjson的bug導致的當前json字符串,反序列化失敗。a6G28資訊網——每日最新資訊28at.com

到底是什么問題呢?a6G28資訊網——每日最新資訊28at.com

5 轉義

之前的數據,我在仔細看了看。a6G28資訊網——每日最新資訊28at.com

里面是對雙引號,是使用了轉義的,具體是這樣做的:/"。a6G28資訊網——每日最新資訊28at.com

莫非還是這個轉義的問題?a6G28資訊網——每日最新資訊28at.com

其實我之前已經注意到了轉義的問題,但使用Test類測試過,沒有問題。a6G28資訊網——每日最新資訊28at.com

當時的代碼是這樣的:a6G28資訊網——每日最新資訊28at.com

public class Test {    public static void main(String[] args) {        String json = "{/"accountNonExpired/":true,/"accountNonLocked/":true,/"authorities/":[{/"authority/":/"admin/"}],/"credentialsNonExpired/":true,/"enabled/":true,/"id/":13,/"password/":/"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe/",/"roles/":[/"admin/"],/"username/":/"admin/"}";        Map map = JSON.parseObject(json, Map.class);        // 輸出解析后的 JSON 對象        System.out.println(map);    }}

里面也包含了一些轉義字符。a6G28資訊網——每日最新資訊28at.com

我帶著試一試的心態,接下來,打算將轉義字符去掉。a6G28資訊網——每日最新資訊28at.com

看看原始的json字符串,解析有沒有問題。a6G28資訊網——每日最新資訊28at.com

怎么去掉轉義字符呢?a6G28資訊網——每日最新資訊28at.com

手寫工具類,感覺不太好,可能會寫漏一些特殊字符的場景。a6G28資訊網——每日最新資訊28at.com

我想到了org.apache.commons包下的StringEscapeUtils類,它里面的unescapeJava方法,可以輕松去掉Java代碼中的轉義字符。a6G28資訊網——每日最新資訊28at.com

于是,我調整了一下代碼:a6G28資訊網——每日最新資訊28at.com

json = StringEscapeUtils.unescapeJava(json);JSON.parseObject(json, UserEntity.class);

這樣處理之后,發現反序列化成功了。a6G28資訊網——每日最新資訊28at.com

總結

這個問題最終發現還是轉義的問題。a6G28資訊網——每日最新資訊28at.com

那么,之前Test類中json字符串,也使用了轉義,為什么沒有問題?a6G28資訊網——每日最新資訊28at.com

當時的代碼是這樣的:a6G28資訊網——每日最新資訊28at.com

public class Test {    public static void main(String[] args) {        String json = "{/"accountNonExpired/":true,/"accountNonLocked/":true,/"authorities/":[{/"authority/":/"admin/"}],/"credentialsNonExpired/":true,/"enabled/":true,/"id/":13,/"password/":/"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe/",/"roles/":[/"admin/"],/"username/":/"admin/"}";        Map map = JSON.parseObject(json, Map.class);        System.out.println(map);    }}

但在filter中的程序,在讀取到這個json字符串之后,發現該字符串中包含了/轉義符號,程序自動把它變成了///。a6G28資訊網——每日最新資訊28at.com

調整一下Test類的main方法,改成三個斜杠的json字符串:a6G28資訊網——每日最新資訊28at.com

public static void main(String[] args) {    String json = "{///"accountNonExpired///":true,///"accountNonLocked///":true,///"authorities///":[{///"authority///":///"admin///"}],///"credentialsNonExpired///":true,///"enabled///":true,///"id///":13,///"password///":///"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe///",///"roles///":[///"admin///"],///"username///":///"admin///"}";    Map map = JSON.parseObject(json, Map.class);    System.out.println(map);}

執行結果:Exception in thread "main" com.alibaba.fastjson.JSONException: illegal identifier : /pos 1, line 1, column 2{/"accountNonExpired/":true,/"accountNonLocked/":true,/"authorities/":[{/"authority/":/"admin/"}],/"credentialsNonExpired/":true,/"enabled/":true,/"id/":13,/"password/":/"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe/",/"roles/":[/"admin/"],/"username/":/"admin/"}拋出了跟文章最開始一樣的異常。a6G28資訊網——每日最新資訊28at.com

說明其實就是轉義的問題。a6G28資訊網——每日最新資訊28at.com

之前,我將項目的日志中的json字符串,復制到idea的Test的json變量中,當時將最外層的雙引號一起復制過來了,保存的是1個斜杠的數據。a6G28資訊網——每日最新資訊28at.com

這個操作把我誤導了。a6G28資訊網——每日最新資訊28at.com

而后面從在線的json工具中,把相同的json字符串,復制到idea的Test的json變量中,在雙引號當中粘貼數據,保存的卻是3個斜杠的數據,它會自動轉義。a6G28資訊網——每日最新資訊28at.com

讓我意識到了問題。a6G28資訊網——每日最新資訊28at.com

好了,下次如果遇到類似的問題,可以直接使用org.apache.commons包下的StringEscapeUtils類,先去掉轉義,再反序列化,這樣可以快速解決問題。a6G28資訊網——每日最新資訊28at.com

此外,這次使用了3種不同的反序列化工具,也看到了其中的一些差異。a6G28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-97297-0.html一個詭異的Json反序列化問題

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: RecyclerView的緩存機制及使用策略

下一篇: 圖解 Jenkins Pipeline 的前端自動化部署,用上后真香!

標簽:
  • 熱門焦點
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了——貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 攜眾多高端產品亮相ChinaJoy,小米帶來一場科技與人文的視聽盛宴

    7月28日,全球數字娛樂領域最具知名度與影響力的年度盛會中國國際數碼互動娛樂展覽會(簡稱ChinaJoy)在上海新國際博覽中心盛大開幕。作為全球領先的科
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲欧美日韩精品久久亚洲区| 韩国视频理论视频久久| 欧美激情中文字幕一区二区| 欧美精品电影| 欧美视频三区在线播放| 国产精品一二| 在线观看亚洲专区| a91a精品视频在线观看| 香港久久久电影| 美女精品自拍一二三四| 欧美日本韩国一区二区三区| 国产精品免费一区二区三区在线观看| 国产一区二区三区久久悠悠色av | 狠狠狠色丁香婷婷综合激情| 亚洲国产一区二区a毛片| 亚洲视频999| 久久久久久久激情视频| 欧美日韩1234| 国产一区二区三区网站| 亚洲狼人综合| 欧美一区二区三区另类| 欧美精品久久天天躁| 国产日韩av一区二区| 亚洲精品乱码久久久久久按摩观| 亚洲欧美在线磁力| 欧美精品激情在线观看| 国产一级一区二区| 9久re热视频在线精品| 久久精品国产69国产精品亚洲| 欧美久久久久免费| 国内精品视频在线观看| 亚洲一区高清| 欧美国产欧美亚洲国产日韩mv天天看完整 | 一区二区日韩免费看| 久久久久综合一区二区三区| 欧美午夜视频| 亚洲成色最大综合在线| 欧美一区二区三区精品电影| 欧美日韩免费观看一区二区三区 | 国产精品成人免费| 亚洲国产99精品国自产| 欧美一区二区日韩一区二区| 欧美日韩中文字幕精品| 亚洲高清不卡av| 欧美一区成人| 国产精品久久久久久久久久三级 | 性欧美video另类hd性玩具| 欧美日韩一级黄| 亚洲国产精品一区二区第四页av | 欧美在线视频网站| 国产精品hd| 亚洲精品黄网在线观看| 久久综合电影一区| 国产欧美日韩精品一区| 一区二区三区欧美亚洲| 欧美激情一区二区三区成人| 影音先锋亚洲视频| 欧美自拍偷拍| 国产精品一区二区你懂得| 一区二区欧美在线| 欧美激情一区二区三区在线视频观看 | 国产一区二区三区高清| 亚洲影视在线播放| 欧美日韩国产页| 最新日韩在线视频| 裸体女人亚洲精品一区| 韩国视频理论视频久久| 欧美在线亚洲在线| 国产日韩欧美在线播放| 午夜精品理论片| 国产精品久久久久久亚洲调教| 亚洲精选视频免费看| 欧美freesex8一10精品| 亚洲高清在线观看一区| 鲁大师影院一区二区三区| 国内揄拍国内精品久久| 久久福利一区| 国产午夜精品在线| 欧美主播一区二区三区| 国产亚洲亚洲| 久久久久久久999精品视频| 国产一区二区三区直播精品电影| 午夜精品在线看| 国产欧美一区二区色老头| 欧美亚洲在线视频| 国产性做久久久久久| 久久精品人人| 激情综合网激情| 老司机精品视频网站| 亚洲国产精品成人久久综合一区 | 国产精品九九久久久久久久| 亚洲综合成人在线| 国产伦精品一区二区三区免费迷| 亚洲欧美日韩国产精品| 国产日韩欧美一区二区| 久久午夜电影| 亚洲激情第一区| 欧美日产在线观看| 亚洲一区二区av电影| 国产美女精品一区二区三区| 久久精品毛片| 亚洲高清毛片| 欧美日韩国产精品专区| 亚洲一区在线播放| 国产欧美在线观看一区| 久久久噜噜噜久久人人看| 亚洲第一黄色网| 欧美区一区二区三区| 亚洲一区二区少妇| 国产亚洲欧美一区在线观看| 美女网站久久| 一本到12不卡视频在线dvd| 国产精品美女| 久久免费精品日本久久中文字幕| 亚洲国产精品99久久久久久久久| 欧美精品激情blacked18| 亚洲一级二级| 国产中文一区二区| 欧美国产日本| 亚洲永久免费视频| 国语精品中文字幕| 欧美精品福利在线| 亚洲欧美日韩视频二区| 伊人久久久大香线蕉综合直播| 欧美精品一区三区| 午夜精品久久久久久久男人的天堂 | 国产日产欧美一区| 男人插女人欧美| 亚洲性xxxx| 国产手机视频精品| 欧美二区在线观看| 亚洲欧美在线视频观看| 亚洲第一区在线| 国产精品videosex极品| 久久漫画官网| 亚洲视频免费| 激情av一区| 欧美午夜在线观看| 久久蜜桃精品| 亚洲性视频网站| 亚洲成人在线观看视频| 国产精品日韩在线| 免费观看亚洲视频大全| 亚洲欧美日本在线| 亚洲电影网站| 国产精品久久一级| 欧美大片免费久久精品三p| 午夜精品一区二区三区在线播放| 亚洲国产精品激情在线观看| 国产精品日韩欧美一区二区| 麻豆视频一区二区| 午夜精品av| 日韩午夜高潮| 精品av久久707| 国产精品日韩在线一区| 欧美高清在线一区| 久久国产免费看| 亚洲无限av看| 久久精品动漫| 亚洲影院色无极综合| 亚洲欧洲一级| 韩日成人av| 国产精品久久久久久久久久直播 | 永久555www成人免费| 国产精品亚洲片夜色在线| 欧美激情中文不卡| 久久精品一区二区三区不卡牛牛| 亚洲深夜av| 亚洲精品欧美日韩专区| 在线精品福利| 国产一区二区三区日韩欧美| 国产精品草草| 欧美日韩视频专区在线播放| 欧美h视频在线| 久久久人成影片一区二区三区观看| 亚洲尤物视频网| 一区二区高清视频在线观看| 亚洲激情网站| 亚洲高清在线视频| 在线看日韩欧美| 国际精品欧美精品| 国产欧美日韩亚州综合| 国产精品高潮久久| 欧美日韩另类字幕中文| 欧美精品福利在线| 欧美激情aⅴ一区二区三区| 美女在线一区二区| 久热成人在线视频| 欧美一级欧美一级在线播放| 亚洲男女自偷自拍图片另类| 一区二区三区不卡视频在线观看 | 麻豆亚洲精品| 免费不卡在线观看av| 久久影视三级福利片| 久久亚洲视频| 久久蜜桃资源一区二区老牛| 久久久久青草大香线综合精品| 久久9热精品视频| 欧美一区二区三区免费大片| 欧美一区二区三区在线观看| 香蕉久久夜色精品| 欧美一区三区二区在线观看| 亚洲欧美综合另类中字| 午夜精彩视频在线观看不卡 |