java 替換json字串中間的引號保留兩邊的引號,避免json校驗失敗
阿新 • • 發佈:2019-01-10
問題描述
解析爬取的json資料時,報如下錯誤:
com.alibaba.fastjson.JSONException: syntax error, position at 4164, name mc
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:586)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:1157)
at com .alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:476)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1327)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1293)
at com.alibaba.fastjson.JSON.parse(JSON.java :137)
at com.alibaba.fastjson.JSON.parse(JSON.java:128)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:201)
at com.nawang.crawl.GuizhouEnterpriseListCrawlAll2.crawlList(GuizhouEnterpriseListCrawlAll2.java:210)
at com.nawang.crawl.GuizhouEnterpriseListCrawlAll2.main(GuizhouEnterpriseListCrawlAll2.java :85)
問題原因
獲取到”d”名稱對應的所需結果
String allData = (String) JSONObject.parseObject(searchListStr).get("d");
除錯時發現結果集 allData 字串中間含有1個或多個雙引號(”)導致校驗失敗
{"mc":"崔記"純淨水經營部"},
{"mc":"貳+壹"休閒吧"},
{"mc":"富貴鳥"皮鞋經營店"},
{"mc":"紅萍果"窗簾"}
用線上JSON校驗格式化工具解析報錯:
第1行解析錯誤:
{"mc":"崔記"純淨水經營部"},{"mc":"貳+壹
----------^
期望是 'EOF', '}', ':', ',', ']'
將字串中間的雙引號”去掉就符合JSON格式了,校驗成功。
解決方法
當然是想辦法如何去掉字串中間的雙引號。
直接替換引號是不行的,名稱/值對全是雙引號括起來的,只是多了中間的雙引號。
最後想了個方法,利用名稱/值對的固定格式進行雙引號單引號替換,其餘的雙引號替換為空,然後單引號替換回雙引號。
原字串如 :
{“mc”:”崔記”純淨水經營部”},{“mc”:”貳+壹”休閒吧”},…
String s = allData.replaceAll("\\{\"","{'") // {" --> {'
.replaceAll("\":\"", "':'") // ":" --> ':'
.replaceAll("\",\"", "','") // "," --> ','
.replaceAll("\":", "':") // ": --> ':
.replaceAll(",\"", ",'") // ," --> ,'
.replaceAll("\"\\}", "'}") // "} --> '}
.replaceAll("\"", "") // " --> 空,以去掉字串中間的引號
.replaceAll("'", "\"") // ' --> ",所有的單引號替換回雙引號
.replaceAll("<br />", "") // 去掉字串中的<br />
.replaceAll("\\\\", "?"); // 字串中含\也會導致解析失敗
JSONObject jsonData = JSONObject.parseObject(s);
這樣處理後,JSON 解析成功。