PHP 里 empty((object)[])是 false 还是 true?
JSON.parse(‘{}’)==null
false
但是就你这个帖子,你混淆了 map 和 object
某些 PHP 项目为了避免这个麻烦,干脆约定 JSON 中所有值为[]或{}的字段都传 null 或不包含这个字段。
传 null 这个方案个人认为非常不妥,两者的语义不完全相同
// 空对象
{
“data”: {
// 同类型
“id”: null or -1,
“name”: “”,
}
}
// 主的, 这个让前端怎么判断, getAttribute 之前先 if exists ?
{
“data”: {
}
}
// 还不如直接给个 null, 前端知道不用解析了
{
“data”: null,
}
不过每种方法都可以,一切最重要的是约定.
<?php
$linksArray = [1, 4, “0”, “V”, null, false, true, ‘true’, “N”];
var_dump(json_encode(array_map(‘strval’, $linksArray)));
@JJstyle
1 、{}在 json_decode 之后会变成 [],emm,php 默认解析 object 的
2 、动态解析的 json 直接返回字符串,让前端判断是否是字符串或者是 JSON,这操作真是看不懂。我认为在制订 API 、数据结构时就能解决这些奇怪的问题。
<?php
// default object
var_dump(json_decode(‘{}’)); // object(stdClass)#1 (0) { }
// array
var_dump(json_decode(‘{}’, true)); // array(0) { }
最后说一点语言都有存在的道理,不要捧一个语言踩一个语言,我认为这个行为很 low
反序列化和序列化出来的字符串,一样的
你要想想,以前数组,还要写 array()呢,现在变成[],不就是有些致力改变它的人的努力吗
https://gist.github.com/Jaggle/9338af5321d3294d86d350fd2cad0fc9
u1s1,我踩 php 了?我又捧了哪个语言?
$str = ‘[{},{}]’;
$data = json_decode($str);
var_dump($data);
输出:
array(2) {
[0] =>
class stdClass#153 (0) {
}
[1] =>
class stdClass#154 (0) {
}
}
php 版本 7.2.1
我误怪 json_decode 这个函数了,本质上是因为 laravel 在接收参数时,默认用的 json_decode($request, true)解析参数,因此它会把{} decode 成 [],并非抹黑,只是被坑过有点恼火。
解决办法是 1. 针对特定接口使用 json_decode($request, false)解析参数为 object,2. 动态 json 字段使用字符串传输,依然使用 json_decode($request, true)解析参数为 array 。我们选择了第二种方案。
我的锅我的锅我的锅