如何移除JSON字符串中非法前置短横?全局replace及无输出问题解决
我来帮你一步步解决这两个问题,先搞定非法JSON的修复,再排查代码无输出的原因:
1. 精准移除JSON中的非法短横
你说得对,全局替换-会破坏正常内容里的短横(比如标题里的Hello-World),所以得用正则表达式匹配特定位置的非法短横。这些非法短横的特征是:
- 出现在
"articles"字段名的前面(比如"- articles") - 出现在数组
[之后、每个对象的前面(比如数组里的- {"title": ...})
可以用下面的正则表达式来精准匹配这些位置的-(包括后面跟着的空格):
String validJson = invalidJson.replaceAll("(?<=\"articles\":\\s*)-\\s*|(?<=\\[)\\s*-\\s*|(?<=,\\s*)\\s*-\\s*", "");
正则说明:
(?<=\"articles\":\\s*)-\\s*:匹配"articles":后面的-和空格(?<=\\[)\\s*-\\s*:匹配数组开头[后面的-和空格(?<=,\\s*)\\s*-\\s*:匹配数组元素逗号后面的-和空格
举个例子,原错误JSON:
{ "- articles": [ - {"title": "Hello-World", "content": "Test-content"}, - {"title": "Another-Article", "content": "More-content"} ] }
替换后会变成合法的JSON:
{ "articles": [ {"title": "Hello-World", "content": "Test-content"}, {"title": "Another-Article", "content": "More-content"} ] }
2. 排查extractNews方法无输出的原因
你的代码有几个明显的问题,导致循环根本没执行,甚至有异常也看不到:
问题1:循环条件完全写反了
原代码里的循环条件是:
for(int i = 0; baseJsonObject.length() < i ; i++)
这里baseJsonObject.length() < i的意思是只有当数组长度小于当前索引i时才执行循环,但初始i=0,数组长度肯定大于0,所以循环直接跳过,根本不会处理任何元素。正确的条件应该是i < baseJsonObject.length()。
问题2:错误地从根JSONObject获取title
原代码里直接从baseJSONObj拿title:
String article = baseJSONObj.getString("title");
但title是数组里每个对象的字段,应该先从JSONArray中取出单个文章对象,再从对象里拿title。
问题3:捕获异常但不做任何处理
原代码的catch块是空的:
catch (JSONException j){}
如果JSON解析出了问题(比如原JSON非法),你根本看不到任何错误信息,无法调试。至少要打印异常栈信息。
问题4:变量名混淆
你把JSONArray命名为baseJsonObject,很容易和根JSONObject搞混,建议改成更清晰的名字,比如articlesArray。
修复后的完整代码:
public static ArrayList<String> extractNews(){ ArrayList<String> news = new ArrayList<String>(); try{ JSONObject baseJSONObj = new JSONObject(SAMPLE_JSON); JSONArray articlesArray = baseJSONObj.getJSONArray("articles"); // 修正变量名 for(int i = 0; i < articlesArray.length() ; i++) { // 修正循环条件 JSONObject articleObj = articlesArray.getJSONObject(i); // 从数组中获取单个文章对象 String title = articleObj.getString("title"); // 从文章对象中取title news.add(title); } }catch (JSONException j){ j.printStackTrace(); // 打印异常,方便调试 } return news; }
内容的提问来源于stack exchange,提问作者Satya Routray
相关产品推荐
相关产品推荐

