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

org.json.JSONObject反序列化含转义符的JSON参数出现Missing value异常如何解决

问题根因

该报错本质是URL参数未编码导致服务端解析时破坏了原始JSON结构:

  • 未编码的JSON中{、"、}均属于URL保留字符,Apache、Servlet容器在解析GET请求的Query参数时,会自动对这类字符做截断、转义处理,你代码中拿到的myIncomingJson已经不是完整合法的JSON,才会抛出「字符位置1缺失值」的异常。
  • 格式化JSON后可正常运行属于偶发现象,是格式化添加的空格、换行无意中避开了容器的特殊字符解析规则,无法作为稳定解决方案使用。

无需修改客户端的解决方案

方案1:读取原始QueryString提取JSON(优先推荐)

跳过Servlet容器的参数解析逻辑,直接从原始请求QueryString中截取JSON内容,可百分百拿到客户端发送的原始内容:

// 获取原始请求的完整QueryString
String rawQuery = request.getQueryString();
String jsonContent = null;
if (rawQuery != null && rawQuery.startsWith("lista=")) {
    // 直接截取lista=之后的所有内容,不要做URLDecode,避免破坏JSON结构
    jsonContent = rawQuery.substring(6);
}
// 正常解析JSON即可
JSONObject jso = new JSONObject(jsonContent);

该方案无需修改任何服务端配置,兼容性最高,不会引入额外安全风险。

方案2:修改容器的URL特殊字符限制

如果使用Tomcat作为Servlet容器,可在conf/catalina.properties中添加如下配置,放宽URL特殊字符允许范围:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}"

如果使用Apache做反向代理,需在Apache配置中添加如下规则,避免代理过程中截断特殊字符:

AllowEncodedSlashes On
ProxyPassMatch ^/(.*)$ http://localhost:8080/$1 nocanon

该方案需要重启对应的服务组件,且会放宽服务端的URL安全校验限制,仅建议方案1无法落地时使用。

方案3:兼容修复已被破坏的JSON串

如果必须沿用request.getParameter的取值逻辑,可根据实际拿到的异常JSON结构做兼容性修复:

String jsonContent = request.getParameter("lista");
// 示例修复逻辑:补全被截断的前导括号,可根据实际拿到的错误内容调整规则
if (jsonContent != null && !jsonContent.startsWith("{")) {
    jsonContent = "{" + jsonContent;
}
JSONObject jso = new JSONObject(jsonContent);

该方案适配性最差,仅建议作为临时应急补丁使用。

内容的提问来源于stack exchange,提问作者Leonardo Dalcegio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:18:04