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
相关产品推荐
相关产品推荐

