我对php开发相对较新,但对一般的Web开发并不陌生。
我有以下 php 文件:
<?php
class dialogResult{
var $Message;
var $Title;
var $Height;
var $GenericData;
function __construct(){
$this->Height = 10;
}
}
header("Cache-Control: no-cache", true);
header("Content-type: application/json; charset=utf-8", true);
$dr = new dialogResult();
$dr->Message = "A Test Message encoded";
$dr->Height = 10;
$dr->GenericData = "Empty";
$dr->Title = "My Message";
echo(json_encode($dr));
?>
这将按预期返回 JSON 数据,但是如果我将类移动到单独的文件并添加包含、include_once、要求或require_once它会返回无效的 JSON 数据。谁能告诉我为什么会这样?
它不必只是移动这个类,如果我有任何包含的文件,它会使数据无效。
谢谢
基思
这是包含类,我也尝试删除了?>
<?php
class dialogResult{
var $Message;
var $Title;
var $Height;
var $GenericData;
function __construct(){
$this->Height = 10;
}
}
任何地方都没有前导或尾随空格。以下是返回的"无效"JSON:
{"Message":"A Test Message encoded","Title":"My Message","Height":10,"GenericData":"Empty"}
如果我尝试使用 JSONLint 解析它,它会给我一个"意外令牌"。当然,如果我手动输入到 JSONLint 中,那就没问题了。我想有一些我无法识别/看到的字符出现在 JSON 中,但不确定如何找到它。
即使是 Martin 和 navnav 注释也是正确的,但空格通常不会像二进制格式那样使 Json 格式无效(例如。GIF、JPEG 等)。
因此,您的问题可以是BOM标头,许多编辑器不显示的2/3字节标头,或者更糟糕的是,在文件开头添加。
编辑
删除 BOM 的一种可能方法是像 phpstorm 一样使用和 IDE,具有二进制安全编辑器,能够检测和删除 BOM。
可能是您在包含的文件中在屏幕上回显/打印某些内容。
JSON 与其他内容不符。
还有您的?>
标签 - 该标签后是否有任何换行符/空格?如果是这样,那就是你的问题。删除它们。事实上,如果文件只包含 PHP 代码,请完全删除 ?>
标记,因为它不需要。
检查您的类中是否有任何空格字符在 [?php 之前和后面 ?]。这将触发提供给浏览器的内容,并会创建一个无法创建HTTP标头警告,这将给出错误的JSON。
检查您的脚本 - 您要包含此脚本的脚本 - 也。
对于许多Web开发人员来说,出于这个确切的原因,不使用?>已经成为一种"最佳实践"。
无效数据的外观如何?