【问题标题】:PHP include files are making JSON data invalidPHP 包含文件使 JSON 数据无效
【发布时间】:2012-06-29 12:07:33
【问题描述】:

我对 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、include_once、require 或 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 中,但不知道如何找到它。

【问题讨论】:

  • 您是否使用这些包含的文件在屏幕上回显/打印任何内容?
  • 回显时得到什么输出?
  • 您是如何尝试获取 JSON 数据的?
  • 另外,请尝试删除那些自定义标题。看看会发生什么。
  • 我正在使用 jquery: $.ajax({ type: "POST", cache: false, url: fn, data: dataToUse, dataType: "json", success: successFn == null ? DialogResultSuccess : successFn,​​ error: errorFn == null ? DialogResultFail : errorFn, beforeSend: function () { $.blockUI({ message: blockMessage }); } }) 获取值。我已经删除了自定义标题,但仍然得到该结果。

标签: php json


【解决方案1】:

即使 Martin 和 navnav cmets 也是正确的,但空格通常不会像二进制格式(例如 GIF、JPEG 等)那样使 Json 格式无效。

所以您的问题可能是 BOM header 一个 2/3 字节的标题,许多编辑器没有显示,或者更糟糕的是,添加在文件的开头。

编辑

删除 BOM 的一种可能方法是使用像 phpstorm 这样的 IDE,它具有二进制安全编辑器,能够检测和删除 BOM。

【讨论】:

  • 我下载了 phpstorm 并编辑了相同结果的文件。如果我有任何包含文件(不仅仅是带有 dialogresult 类的文件),我会得到无效的 json。如果我在文件中包含没有包含的 dialogresult 类,那么它工作得很好。
  • 您好,请确认:您是否在文件菜单下选择了“删除 BOM”?
  • 这最终成为了问题。感谢您的帮助,我实际上使用了不同的方法来获取数据,但我讨厌自定义编写股票功能。
【解决方案2】:

可能是您在包含的文件中在屏幕上回显/打印某些内容。

JSON 不适用于其他内容。

还有你的?&gt; 标签——在那个标签之后有没有换行符/空格?如果是这样,那就是你的问题。删除它们。事实上,如果文件只包含 PHP 代码,请完全删除 ?&gt; 标记,因为它不需要。

【讨论】:

    【解决方案3】:

    如果在 [?php 和 ?] 之前有任何空白字符,请检查您的班级。这会触发提供给浏览器的内容,并会创建一个 HTTP Header cannot be created 警告,这会给出错误的 JSON。

    检查你的脚本 - 你要包含这个的那个 - 也。

    出于这个确切原因,对于许多 Web 开发人员来说,不使用 ?> 已成为某种“最佳实践”。

    无效数据长什么样子?

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 2014-05-17
      • 2019-06-01
      • 1970-01-01
      • 2021-04-20
      • 2017-11-12
      • 2016-01-27
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多