You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:24:59