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

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

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

{
    type: 0
}

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

10190 次点击
所在节点    PHP
74 条回复
klgd
2018-01-10 09:17:07 +08:00
LeungJZ
2018-01-10 09:18:11 +08:00
因为从数据库里面查出来的吧?即使是 int,到 php 也会成了 String。
最简单的方法是,让后台在所有要转成 int 型的变量前面加个 + 即可。
not4jerk
2018-01-10 09:18:19 +08:00
```php
json_encode($arrayOrObject, JSON_NUMERIC_CHECK)
```
在叫你们 PHP 后端在加上这个参数`JSON_NUMERIC_CHECK` 使用的字符数字都会变成`json-number`

垃圾 thinkPHP3 默认返回 json 就是数字字符分不清
qqjt
2018-01-10 09:18:24 +08:00
这肯定是后端要做的工作啊,不按定义好的来算 bug 啊
lrh3321
2018-01-10 09:40:57 +08:00
类型不对,直接返回错误,我就当被攻击了。文档都定义好了,不按文档来,就别怪后端不返回数据了。
nullen
2018-01-10 09:45:46 +08:00
让服务端 PHP 做一下类型转换:
[
'type': (int) $type
]
owenliang
2018-01-10 09:50:44 +08:00
客户端自己处理。
alex321
2018-01-10 09:52:08 +08:00
尤其 MySQL 中是 int,查询直接返回会存在变成 string 的情况,得强制 int 一下。。。。
enenaaa
2018-01-10 09:53:13 +08:00
@not4jerk 这样会把纯数字的字符串当成数字类型。
php 这个问题有点蛋疼。
8355
2018-01-10 09:57:19 +08:00
基础格式化问题啊.
做一个统一的格式化返回函数, code msg data.
code 和 msg 强制转字符串 data 强制数组
做这个的意义不仅仅是数据类型层面的还能避免手误 比如 code 打成 cdoe
jea
2018-01-10 10:04:53 +08:00
这东西, 前后端商量好一个类型, 自然就是后端处理固定类型了
daryl
2018-01-10 10:09:07 +08:00
php 在 json_encode 数组元素强制类型转换成需要的类型就好了。这不是实现不了,就是懒= =
Raidal
2018-01-10 10:12:49 +08:00
强制转换也挺蛋疼的
yujieyu7
2018-01-10 10:37:17 +08:00
后端 php 的锅没跑,“问他们说代码都没改,返回数据的类型变了”,那这是 bug 让他给修啊

其实很简单,php 端加个类型转换的事,当然他可能让你们自己转换,那看你们协商的情况了
crysislinux
2018-01-10 10:39:26 +08:00
赞同 LS 的,这不是 PHP 的问题,这是你们后端实现的 bug
tailf
2018-01-10 10:51:56 +08:00
楼上没有一个有正确姿势的。



-- 分割线 --


http://json-schema.org 我已经成功用上。
lshero
2018-01-10 10:52:01 +08:00
还好你没有遇到一会儿空对象一会儿空数组的问题
iyaozhen
2018-01-10 10:55:42 +08:00
「定义好 type 是 number 类型,返回数据一会儿是 string,一会儿是 number 类型,问他们说代码都没改,返回数据的类型变了」
就是 bug 呀,改不了找上级,还改不了楼主想想年后是不是换个公司
omph
2018-01-10 11:11:15 +08:00
@tailf 用这个做接口约定,可读性、性能都怎么样?
jason19659
2018-01-10 11:19:44 +08:00
提 bug。。
还有
{
"type": 0
}

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

https://www.v2ex.com/t/421511

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

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

© 2021 V2EX