PHP 接口返回 JSON 数据保证正确的类型难(或者麻烦)在哪?

2018-01-09 22:49:46 +08:00
 cielpy

一直以来有一个疑问,和后端同事合作时定好了接口文档,如:

{
    type: 0
}

定义好 type 是 number 类型,返回数据一会儿是 string,一会儿是 number 类型,问他们说代码都没改,返回数据的类型变了,Google 一下似乎是有这个问题,但是没有找到一个好的解决方案,我不是写 PHP 的,可能找解决方案的姿势不对,所以想请问一下各位 PHPer,这个问题真的存在吗?如果存在,解决起来有多麻烦?正确的解决方式是什么呢?

10715 次点击
所在节点    PHP
74 条回复
walkonthemarz
2018-01-10 17:59:35 +08:00
没装 mysqlnd 吧
wslsq
2018-01-10 21:11:48 +08:00
建议强转 string 吧,js 无法处理小数和太长的整数
ixiaohei
2018-01-10 21:22:51 +08:00
java 语言从不纠结这个问题....,你这边定义啥类型就 json 反序列化就帮你转啥类型
Heartbleed
2018-01-10 21:32:40 +08:00
The Key
torbrowserbridge
2018-01-10 21:33:40 +08:00
和数据库驱动有关系,和客户端查询选项有关系。
lihongjie0209
2018-01-10 21:37:16 +08:00
动态一时爽
python
2018-01-10 21:49:23 +08:00
动态一时爽
billlee
2018-01-10 22:07:29 +08:00
在于 php 是动态类型 + 弱类型,一不小心就搞错了,Java 就很少搞错。
cielpy
2018-01-11 10:31:54 +08:00
@8355 每个接口的 data 数据不一样呢
gouchaoer
2018-01-11 10:42:39 +08:00
一般从数据库取出来的或者从 POST/GET/SESSION 读入的都是 string,有的参数如果是人工赋值的就是 int,这个显然是 php 后台没有做好
nekoyaki
2018-01-11 11:42:01 +08:00
我看了一下这帖子的评论,我不懂 php,按我的理解,似乎 php (或者可能你们其实是指某 php 的常用框架 /数据库驱动?),从数据库里读出来的字段都强行默认成 string,需要手工处理,是这样吗?

评论里其他人有不少把原因归结为是动态类型 /弱类型的问题,这个肯定是不对的。典型的动态类型语言,比如 python/ruby,从来没有哪个数据库里的数值型字段,读出来竟然默认会变成 string,竟然还需要手工强转的。
ipom
2018-01-11 13:43:22 +08:00
设置一下 PDO 的属性:
Pdo::ATTR_EMULATE_PREPARES => false,
Pdo::ATTR_STRINGIFY_FETCHES => false

至少数据库的查询结果,会保持默认的数据类型,不会把 int 类型转为 string。
AidenChen
2018-01-11 15:54:03 +08:00
使用 mysqlnd 驱动,这样从 Mysql 取出来的数字就不会变成字符串了
cielpy
2018-01-11 17:20:38 +08:00
@nekoyaki 看了这个博客 http://www.druidcoder.cn/2016/05/10/mysql-driver/ php 的数据库驱动在 5.3 之前读出来是都是字符串的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/421511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX