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

前端生成JSON传PHP后json_decode返回NULL问题求助

问题分析与解决方案

你遇到的核心问题是前端生成的合法JSON字符串,传输到PHP后端后被篡改了格式——其中的双引号被转换成了HTML实体",导致json_decode()无法识别合法的JSON结构,最终返回NULL。从你的测试结果也能验证这一点:原本应该是双引号的位置变成了&(实际是"在页面输出时被二次转义成了",所以你看到的是&)。

下面是具体的解决思路和方法:

方法一:PHP端直接修复转义的JSON字符串

在PHP中,先通过htmlspecialchars_decode()把被转义的HTML实体还原为原始字符,再进行JSON解析:

echo '<pre>';
$jsonData = $_POST['jsonData'];
// 将&quot;还原为原始的双引号
$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解析后也更便于业务逻辑处理。

额外排查点

  1. 检查服务器端是否有中间件/框架自动开启了HTML转义功能(比如部分PHP框架的全局转义设置),导致POST数据被篡改;
  2. 确认前端AJAX的processData: false和contentType: false参数已正确设置(你当前代码已经设置,这部分没问题),这两个参数是FormData上传文件时的必要配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:31