【问题标题】:presumed difference in php versions causing difference in JSON output - quotes around integersphp 版本的假定差异导致 JSON 输出的差异 - 整数引号
【发布时间】:2017-07-30 13:44:35
【问题描述】:

我有一个 PHP 版本为 5.5.9 的测试服务器,我们有一个 PHP 版本为 5.6.16 的 QA 服务器。

为了这篇文章,我在两个实例上使用相同的代码分支(完全披露:这是一个 Laravel 安装,但我不确定这是一个 Laravel 问题)

在 QA 服务器上,API 返回 JSON 格式,其中未加引号的整数如下所示(这是简化的):

{["id":1,"name":"John"],["id":2,"name":"Sam"]}

但在我的服务器(5.6.16 版本)上,返回完全相同的 API 调用:

{["id":"1","name":"John"],["id":"2","name":"Sam"]}

而且,Angular 不喜欢这样并且不解析它。

不是数据

数据来源的数据和表格在结构上完全相同 - 我已经验证了这一点。

我不想“修复”Angular

虽然理论上 Angular 应该处理这个(?),但我不想触及我们的前端编码。

我希望输出相同..

无论 Angular 做什么,显而易见的解决方案是让输出完全相等。

我该怎么办?

  • 我想避免在我的服务器上升级 PHP - 这可能会引发更多问题
  • 我在想 json_encode() 中有一个设置可以设置来改变这个,但我不知道是哪一个。
  • 另外,laravel 本身中可能有一个设置,至少可以在我这边进行本地更改。据记录,代码库中有超过 100 次 json_encode 调用。

【问题讨论】:

  • 我的猜测。它是如何加载数据的......而不是 json_encode()
  • 如果数据来自数据库,可能与使用的mysql驱动有关:stackoverflow.com/questions/5323146/…
  • @jeroen 写的 100% 是您遇到的问题。一台服务器可能具有 PHP 的 mysql 本机驱动程序,而另一台则没有。如果没有mysqlnd,PHP 无法解释数据类型,因此它将它们视为字符串,因此引用整数。您应该更新您的 PHP。另一种解决方案是手动类型转换字段 - 这可能会占用大量时间。
  • 感谢@jeroen,也感谢@Mjh 为驱动程序指定PHP 升级。这是最优雅的解决方案,因为更新 json_encode() 的所有实例将是不可靠的并且是 hack。

标签: php json laravel quotes string-literals


【解决方案1】:

这在json_encode() 中不是问题,而是您正在编码的内容有所不同。看这个简单的例子

$a = array(
    'id' => 111,
    'astring' => 'test',
    'OhLookItsANumberRecordedAsAString' => '456'
);
$json = json_encode($a);
echo $json;

结果

{"id":111,
 "astring":"test",
 "OhLookItsANumberRecordedAsAString":"456"
}

但如果你确定整数是整数,那么一切都如你所愿

$a = array(
        'id' => 111,
        'astring' => 'test',
        'OhLookItsANumberRecordedAsAString' => '456',
        'ANumber' => (int)'456'
    );
$json = json_encode($a);
echo $json;

结果

{"id":111,
 "astring":"test",
 "OhLookItsANumberRecordedAsAString":"456",
 "ANumber":456
}

【讨论】:

  • 感谢这里的帖子,但我的 OP 下方的实际 cmets 实际上是最有先见之明的。从为什么这种情况发生的角度来看,这没有帮助。类型转换的要点 - 以这种方式更新代码会很困难。
【解决方案2】:

作为@RiggsFolly,它绝对取决于源如何提供整数数据。如果数字是从源引用的,则 json_decoder 将它们视为字符串。

您可以尝试:将 json_encode 作为第二个参数,称为 $options。将其设置为尝试将数字编码为整数而不是字符串。

http://php.net/manual/en/function.json-encode.php

PHP json_encode encoding numbers as strings

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多