【问题标题】:HTML is NULL in JSON object from json_encode来自 json_encode 的 JSON 对象中的 HTML 为 NULL
【发布时间】:2014-01-13 08:51:01
【问题描述】:

我有一个 ajax 调用调用一个 php 文件,该文件运行一个长 php 函数,该函数返回一个 JSON 编码的数组/对象。现在我需要将 HTML 也发送到 ajax 响应中。我考虑过在数组中发送 HTML。

这是一个好习惯吗?

现在我无法让它工作,我得到一个NULL 作为该属性的值。不知道为什么。

$statHTML = '<table>';
foreach ($toHTML as $key=>$value) {
    $statHTML.= '
        <tr class="'.$key.'">
            <td class="side">'.$value[0].'</td>
            <td>'.$value[2].' '.$value[1].'</td>
        </tr>';
}
$statHTML.= '</table>';
//  echo $statHTML;   // - this works
//function return   
$answer = array('mostSearched'=>$mostSearched,
                'timeOfDay' => $timeOfDay,
                'mostSearchedDays'=>$mostSearchedDays,
                'statHTML' => $statHTML                 
            );
return json_encode($answer);

JSON.parse()之前来自控制台的ajax响应:

{
    "mostSearched": {
        "title": "Most serached houses",
        "colNames": [21],
        "rowNames": [2013],
        "rows": [1]
    },
    "timeOfDay": {
        "title": "Time of search",
        "colNames": ["07:30"],
        "rowNames": ["07:30"],
        "rows": [
            [1]
        ]
    },
    "mostSearchedDays": {
        "title": "Most searched days",
        "colNames": ["2013-12-21", "2013-12-22", "2013-12-23", "2013-12-24", "2013-12-25", "2013-12-26", "2013-12-27"],
        "rowNames": ["2013-12-21", "2013-12-22", "2013-12-23", "2013-12-24", "2013-12-25", "2013-12-26", "2013-12-27"],
        "rows": [
            [1, 1, 1, 1, 1, 1, 1]
        ]
    },
    "statHTML": null
}

【问题讨论】:

  • 你试过 var_dump json_encode($answer); 吗?
  • @MarkusKottländer,之前没有尝试过。现在做了,得到一个 JS 错误:Uncaught SyntaxError: Unexpected token s 在这一行:var object = JSON.parse(response);
  • 是的,当然,我只是想测试 json_encode() 的行为。为此直接调用您的 php 脚本。此外 json_encode 仅适用于 utf8 编码,我不知道其他编码的行为。
  • @MarkusKottländer,当我直接调用 php 时,我得到 String(487)... HTML 又是 NULL。最后一部分是,"statHTML":null}"
  • 试试json_encode(utf8_encode($answer));。对我来说似乎是一个编码问题。

标签: php utf-8 json


【解决方案1】:

PHP 使用的内置 JSON 解析器很可能无法正确解析 HTML,解决此问题的最简单方法是在服务器上对 html 进行 base64 编码,然后在客户端对其进行解码,使用较新的 @ 987654321@ 和 btoa base64 方法,或者是众多 polyfill 中的一种。

【讨论】:

    【解决方案2】:

    转换的时候在这个里面使用base64_enccode

    $answer = array('statHTML'=>base64_encode('<h1>html in here</h1>'));
    echo json_encode($answer);exit;
    

    并且在从 ajax 获得响应时

    atob(response.statHTML);
    

    希望您了解它的工作原理

    【讨论】:

      【解决方案3】:

      来自php.net

      参数

      价值

      被编码的值。可以是除资源以外的任何类型。

      所有字符串数据必须采用 UTF-8 编码。

      所以使用:

      $answer = array('mostSearched'=>$mostSearched,
              'timeOfDay' => $timeOfDay,
              'mostSearchedDays'=>$mostSearchedDays,
              'statHTML' => utf8_encode($statHTML)
      );
      
      return json_encode($answer);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 2010-10-02
        相关资源
        最近更新 更多