前端生成JSON传PHP后json_decode返回NULL问题求助
问题分析与解决方案
你遇到的核心问题是前端生成的合法JSON字符串,传输到PHP后端后被篡改了格式——其中的双引号被转换成了HTML实体",导致json_decode()无法识别合法的JSON结构,最终返回NULL。从你的测试结果也能验证这一点:原本应该是双引号的位置变成了&(实际是"在页面输出时被二次转义成了",所以你看到的是&)。
下面是具体的解决思路和方法:
方法一:PHP端直接修复转义的JSON字符串
在PHP中,先通过htmlspecialchars_decode()把被转义的HTML实体还原为原始字符,再进行JSON解析:
echo '<pre>'; $jsonData = $_POST['jsonData']; // 将"还原为原始的双引号 $fixedJson = htmlspecialchars_decode($jsonData); // 第二个参数设为true,会将JSON解析为关联数组(按需选择) $parsedData = json_decode($fixedJson, true); var_dump($parsedData); echo '</pre>';
方法二:前端优化数据结构,避免潜在转义问题
你当前生成的JSON是多个单键对象的数组,这种结构不仅冗余,还可能增加意外转义的概率。可以改成直接生成一个单一对象,让JSON结构更合理:
var jsonObj = {}; // 改为单一对象,而非数组 var formData = new FormData(); $('[name="'+form+'"] *') .not(':input[type=file], :input[type=button], :input[type=submit], :input[type=reset], [name="input_search"]') .filter(':input') .each(function() { var input = $(this); var inputName = input.attr("name"); var inputVal = input.val(); // 处理带[]的数组型表单字段 if (inputName.endsWith('[]')) { var key = inputName.slice(0, -2); if (!jsonObj[key]) jsonObj[key] = []; jsonObj[key].push(inputVal); } else { jsonObj[inputName] = inputVal; } }); var jsonData = JSON.stringify(jsonObj); formData.append('jsonData', jsonData); // 后续AJAX代码保持不变
优化后生成的JSON结构会更清晰:
{"s-file":["Prueba 3"], "text_file":["ORT0000133.pdf"], "idform":"f-gen-desk", "idprocess":"p-save"}
这种结构在PHP解析后也更便于业务逻辑处理。
额外排查点
- 检查服务器端是否有中间件/框架自动开启了HTML转义功能(比如部分PHP框架的全局转义设置),导致POST数据被篡改;
- 确认前端AJAX的
processData: false和contentType: false参数已正确设置(你当前代码已经设置,这部分没问题),这两个参数是FormData上传文件时的必要配置。
内容的提问来源于stack exchange,提问作者user9632001
相关产品推荐
相关产品推荐

