首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >上传到服务器后,所有输出的json数字都是字符串。

上传到服务器后,所有输出的json数字都是字符串。
EN

Stack Overflow用户
提问于 2017-11-11 00:47:48
回答 2查看 103关注 0票数 0

我用的是Laravel 5.5.13。

我成功地测试了我的软糖主机上的所有东西。我现在上传到服务器。

我从phpMyAdmin导出了本地主机中的默认设置(XAMPP,Windows 10),然后使用默认设置在远程phpMyAdmin上进行了导入。

当访问远程主机时,它现在给出了我在迁移中设置的所有字段,如下所示:

代码语言:javascript
复制
$table->integer('extension_id')->unsigned();

作为一个字符串,这是如此奇怪,因为当在本地主机,它是作为一个数字。

在下面的数据中,请注意,在localhost中,displayname_idextensions_id值没有用引号包装。但是id不是,我不明白,它也没有签名。我的目标是使即使是id列都是字符串(如果不可能,则使*_id返回数字)。

这里是来自遥远的地方:

代码语言:javascript
复制
[
    {
        "id": 2,
        "name": "Stencil",
        "kind": "cws",
        "created_at": "2017-11-11 00:26:52",
        "updated_at": "2017-11-11 00:26:52",
        "thumbs_count": "1",
        "thumbs_yes_count": "0",
        "latest_comment": {
            "id": 1,
            "body": "huh?",
            "displayname_id": "1",
            "extension_id": "2",
            "created_at": "2017-11-11 00:26:56",
            "updated_at": "2017-11-11 00:26:56"
        }
    }
]

这里是本地主机:

代码语言:javascript
复制
[
    {
        "id": 2,
        "name": "Stencil",
        "kind": "cws",
        "created_at": "2017-11-11 00:26:52",
        "updated_at": "2017-11-11 00:26:52",
        "thumbs_count": "1",
        "thumbs_yes_count": "0",
        "latest_comment": {
            "id": 1,
            "body": "huh?",
            "displayname_id": 1,
            "extension_id": 2,
            "created_at": "2017-11-11 00:26:56",
            "updated_at": "2017-11-11 00:26:56"
        }
    }
]

这里是我的phpMyAdmin的屏幕:

我的遥控器phpMyAdmin是-

我的本地人是-

下面是表结构的屏幕截图,请注意,id列的列也没有签名,但是它们没有被json_encode编辑成字符串。

下面是导出屏幕截图:https://screenshots.firefoxusercontent.com/images/51d1e47f-fe78-4cdc-8de4-b113d4b576a9.png

以下是导入屏幕截图:https://screenshots.firefoxusercontent.com/images/ff112f86-1c1c-4554-b03c-4b15307c042a.png

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-11 06:45:35

区别在于您的MySQL客户端驱动程序。本地计算机使用的是MySQL本机驱动程序(mysqlnd),而远程服务器使用的是MySQL客户端库(libmysql)。

本机驱动程序(mysqlnd)将将数据库中的所有整数视为PHP中的整数。但是,客户端库(libmysql)将把所有字段视为PHP中的字符串。

id字段在两台服务器上显示为整数的原因是由于某种Laravel魔术。Laravel使用模型的$casts属性在访问时将特定字段强制转换为特定类型。如果模型上的$incrementing属性是true (默认情况下是true),Laravel将自动将主键字段(默认id)添加到由$keyType属性定义的类型(默认int)的$casts属性中。因此,每当您访问id字段时,它都将是一个PHP整数。

如果希望将整数字段视为整数,则可以在远程服务器上安装MySQL本机驱动程序(mysqlnd)。

如果这不是一个选项,或者不可取,则可以使用$casts属性指定将这些字段视为整数:

代码语言:javascript
复制
protected $casts = [
    'displayname_id' => 'int',
    'extension_id' => 'int',
];

现在,无论使用什么MySQL驱动程序,这两个字段都将被视为整数。

如果希望将id作为字符串处理,则可以使用以下几个选项。

首先,您可以将$keyType值更改为string,但这可能会产生意想不到的后果。例如,relationHasIncrementingId类上的BelongsTo检查密钥是否正在递增,密钥类型是否为int,因此如果将$keyType更改为string,此方法将返回false。

其次,您可以直接将'id' => 'string'添加到$casts数组中,因为$casts值在访问属性时优先于$keyType值。这将比更改$keyType值更安全和语义更正确。

第三,如果您希望将id作为一个字符串处理,只用于JSON转换,则可以重写模型上的jsonSerialize()方法。

代码语言:javascript
复制
public function jsonSerialize()
{
    $data = parent::jsonSerialize();

    if (isset($data[$this->primaryKey])) {
        $data[$this->primaryKey] = $this->castAttribute('string', $data[$this->primaryKey]);
    }

    return $data;
}
票数 2
EN

Stack Overflow用户

发布于 2017-11-11 01:37:42

可以肯定的是,此问题来自您的数据库或php的旧版本< 5.2.9

但是您可以尝试将JSON_NUMERIC_CHECK选项传递给您的json_encode,这样就完成了,它将自动将表示数字的字符串转换为数字:

本地PHP解决方案:

代码语言:javascript
复制
echo json_encode($a, JSON_NUMERIC_CHECK);

在线示例

Laravel解决方案:

代码语言:javascript
复制
return response()->json($a, 200, [], JSON_NUMERIC_CHECK);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47233204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档