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.




