【问题标题】:PHP JSON header causes error on JSON.parse (using jQuery)PHP JSON 标头导致 JSON.parse 错误(使用 jQuery)
【发布时间】:2019-01-28 20:25:03
【问题描述】:

我在 JavaScript 中从 PHP 文件中获取了一些 JSON 数据。
要使用数据,我使用JSON.parse(json_response),除非我在 PHP 中使用 JSON 标头

header('Content-Type: application/json');

使用时,我在控制台中收到以下消息:

未捕获的 SyntaxError:位置 1 处 JSON 中的意外标记 o

目前我只是选择使用 PHP header() 或 JS JSON.parse() 并找到 this useful question
它看起来像为我的 JS 脚本设置一个 JSON 标头“自动解析” JSON。

  • 这是正常行为吗?是什么原因造成的?
  • 我该怎么办?在header()JSON.parse() 之间随机选择可能不是一个好主意。

实际代码:
index.chart.php

<?php

header('Content-Type: application/json');
// [...] <- config lines, no output


// Dummy data for Chart.js
$data = [
    'labels'   => ['test', 'a', 'z', 'e', 'r', 't'],
    'datasets' => [
        [
            'label'           => 'First',
            'backgroundColor' => 'rgb(63, 123, 249)',
            'borderColor'     => 'rgb(31, 117, 219)',
            'data'            => [
                20, 10, 30, 45, 51.2, 5
            ],
            'fill' => false
        ]
    ]
];

echo json_encode($data);

?>

index.chart.js

window.addEventListener('DOMContentLoaded', function () {

    // jQuery Ajax
    $.get('assets/inc/index.chart.php').done(function (json) {

        var response = JSON.parse(json);
        console.log(response);

    }).fail(function (error) {
        window.console.log(error);
    });

});

【问题讨论】:

  • 我只使用 json_encode() 并且它可以正常工作...不确定为什么您会收到一个错误而不是另一个错误...似乎可能是一个错误...您能得到结果吗浏览器网络选项卡中的脚本?
  • console.log(json) 看看你到底得到了什么……?如果有的话,标头不会解析内容,标头表示内容是 JSON 格式,所以 jQuery 会自动为您解析。
  • "这是正常行为吗?什么可能导致这个?": "如果没有指定,jQuery 将尝试根据 MIME 类型推断它响应(XML MIME 类型将生成 XML,在 1.4 中 JSON 将生成 JavaScript 对象,在 1.4 中脚本将执行脚本,其他任何内容都将作为字符串返回)" (Source (-> dataType)
  • @deceze console.log(json) without JSON.parse (使用 PHP header) 输出一个解析良好的 JSON 对象。那将来自 jQuery 本身?

标签: javascript php jquery json ajax


【解决方案1】:

如果您没有指定dataType,那么jQuery 将使用Content-Type 标头确定从URL 接收到的数据类型,并通过适当的解析器运行它。

json 不是 JSON 字符串,它是您通过解析 JSON 得到的 JavaScript 对象。

JSON.parse 的输入需要是 JSON 字符串。

变化:

function (json) {
    var response = JSON.parse(json);

收件人:

function (response) {

【讨论】:

    【解决方案2】:

    这是正常行为吗?这可能是什么原因?

    是的,这是正常行为,jQuery.ajax 有converters 用于自动对返回的数据运行某些函数。对于返回 JSON 标头的请求,即jQuery.parseJSON,意味着传递给回调函数的数据已经解析为 JSON。

    我该怎么办?在header()JSON.parse() 之间随机选择可能不是一个好主意。

    您是对的,这只会使您的代码更难遵循。选择一个并在整个项目中保留它。例如,如果您当前使用的其他服务没有为 JSON 设置正确的标头,我建议您始终使用 JSON.parse 而不要在此处使用标头功能。

    【讨论】:

    • 我也没有,直到几分钟前 ;-)
    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 2020-08-17
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多