You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP向JavaScript传数据报错:Unexpected token < in JSON at position 0

问题分析与解决方案

嘿,我当初刚学PHP的时候也踩过这个坑!Unexpected token < in JSON at position 0 这个错误其实很明确:JavaScript拿到的不是纯净的JSON数据,而是以<开头的内容——十有八九是PHP输出的错误提示(带HTML格式),而非你预期的JSON字符串。

问题根源

看你的PHP代码,你直接给$myObj->name赋值,但**$myObj根本没有被初始化**!PHP里必须先创建对象实例,才能给它的属性赋值,否则会触发Notice: Undefined variable: myObj的错误。这个错误信息会以HTML形式输出到页面,导致JS解析时拿到的不是JSON,而是包含错误提示的HTML代码,自然就报错了。

修正后的代码

PHP 代码(两种可选写法)

第一种:初始化标准对象

<?php
// 先创建一个空的对象实例
$myObj = new stdClass();
$myObj->name = "John";
$myObj->age = 30;
$myObj->city = "New York";

// 关键:设置响应头,明确告诉浏览器这是JSON数据
header('Content-Type: application/json');

$myJSON = json_encode($myObj);
echo $myJSON;
?>

第二种:用数组转JSON(新手更直观)

<?php
$myArr = [
    'name' => 'John',
    'age' => 30,
    'city' => 'New York'
];

header('Content-Type: application/json');
echo json_encode($myArr);
?>

优化后的JavaScript代码(增加错误排查)

你的JS代码本身没问题,但可以加个错误捕获,方便以后排查问题:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
    if (this.readyState == 4) {
        if (this.status == 200) {
            try {
                var myObj = JSON.parse(this.responseText);
                document.getElementById("demo").innerHTML = myObj.name;
            } catch (err) {
                // 打印错误和响应内容,快速定位问题
                console.error('JSON解析失败:', err);
                console.log('实际拿到的响应:', this.responseText);
            }
        } else {
            console.error('请求失败,状态码:', this.status);
        }
    }
};
xmlhttp.open("GET", "data.php", true);
xmlhttp.send();

额外注意事项

  • 确保PHP文件开头没有多余的空格、换行或者BOM(有些编辑器会自动添加),这些都会破坏JSON的纯净性。
  • 开发阶段可以开启PHP错误提示,但上线前一定要关闭(或者设置错误日志而非输出到页面),避免错误信息混入JSON输出。

内容的提问来源于stack exchange,提问作者Rakonjac S.

火山引擎 最新活动