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

JavaScript与PHP交互报错:Cannot use object of type stdClass as array

解决JavaScript与PHP交互中的JSON处理错误

看起来你遇到的这个错误根源在于前后端数据格式不匹配,以及PHP代码里的逻辑矛盾,我来帮你一步步梳理并修复:

问题分析

  1. 前端数据格式偏差:你用$('#myForm').serializeArray()得到的是类似[{name: "first", value: "1"}, {name: "second", value: "2"}]的数组结构,转成JSON后发送给后端,这和你预期的{first: x, second: y}键值对格式不匹配。
  2. 后端逻辑矛盾:你既用file_get_contents('php://input')读取JSON数据,又试图用$_POST['first']获取值——但当请求的Content-Type是application/json时,PHP不会自动把JSON解析到$_POST数组里;而且你解析出$numeros后完全没用到,反而去访问不存在的$_POST键,这是核心问题。
  3. 前端冗余配置:AJAX代码里重复写了两次contentType,虽然不是致命错误,但会造成配置覆盖。

修复方案

第一步:修正前端JavaScript代码

我们需要把表单数据转换成键值对格式的JSON,替代serializeArray生成的数组结构:

$(document).ready(function(){
 $('#calcular').click(function(e){
  e.preventDefault();
  // 手动构建符合预期的键值对对象
  var formData = {
    first: $('#myForm input[name="first"]').val(),
    second: $('#myForm input[name="second"]').val()
  };
  var numerosJSON = JSON.stringify(formData);
  $.ajax({
   url: '/process.php',
   type:'post',
   data: numerosJSON,
   contentType: 'application/json; charset=utf-8', // 只保留一次配置即可
   dataType: 'json',
   success: function(soma){
    // 在HTML的div中显示结果
    $('#out').text(soma);
   },
   error: function(xhr, status, error) {
    // 增加错误调试,方便后续排查问题
    console.error('请求出错:', error);
    console.error('响应内容:', xhr.responseText);
   }
  });
 });
})

如果想更通用地处理任意表单,也可以把serializeArray的结果转成键值对:

var formArray = $('#myForm').serializeArray();
var formData = {};
$.each(formArray, function(i, item) {
  formData[item.name] = item.value;
});
var numerosJSON = JSON.stringify(formData);

第二步:修正后端process.php代码

现在后端可以正确读取JSON数据,解析为关联数组后获取数值,同时确保数值是数字类型(避免字符串拼接):

// 读取JSON请求体
$json = file_get_contents('php://input');
// 解析为关联数组(第二个参数true必须加,否则返回对象)
$numeros = json_decode($json, true);

// 先检查必要参数是否存在,避免Undefined索引错误
if (!isset($numeros['first'], $numeros['second'])) {
    http_response_code(400);
    echo json_encode('缺少必要的数字参数');
    exit;
}

// 转换为数字类型,确保执行的是加法而非字符串拼接
$fst = (float)$numeros['first'];
$snd = (float)$numeros['second'];
$soma = $fst + $snd;

// 设置正确的响应头
header('Content-Type: application/json; charset=utf-8');
// 返回JSON格式的计算结果
echo json_encode($soma);

错误根源复盘

你之前遇到的Cannot use object of type stdClass as array错误,大概率是某次测试时没给json_decode加true参数,导致解析返回了对象而非数组,后续又试图用数组方式访问它;而这次代码里的核心问题是逻辑矛盾——既读了JSON又去访问空的$_POST,同时没正确使用解析后的$numeros变量。

按照上面的修改,前后端数据格式就能匹配,应该可以正常返回两数相加的结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:24:02