背景
这周我遇到了一个有趣的根源问题。问题在于PHP数组是如何工作的。我有一个API端点,它使用array_filter,有时返回JSON对象,有时返回JSON数组。以下是一些例子:
json_encode([0 => 1, 1 => 2, 2 => 3])
返回字符串。
"[1,2,3]"
然而,以下代码:
json_encode([0 => 1, 2 => 2, 3 => 3])
返回字符串:
"{"0":1,"2":2,"3":3}"
我的问题
PHP在“标量”(非映射)数组的遮罩下做什么?
假设我有一个数组
[1, 2, 3]
从本质上讲,这就是“简写”的意思吗?
[0 => 1, 1 => 2, 2 => 3]
最后,json_encode
如何返回JSON数组而不是JSON对象?它里面是否有业务逻辑,比如:
如果:
这个PHP8.0RFC会对JSON序列化程序造成潜在的破坏吗?
发布于 2019-11-13 12:41:25
让我们以第一个例子为例,将其与第二个示例进行比较。
json_encode([0 => 1, 1 => 2, 2 => 3]); //returns "[1,2,3]"
//versus
json_encode([0 => 1, 2 => 2, 3 => 3]); //returns "{"0":1,"2":2,"3":3}"
结果的JSON字符串是不同的,因为在第一个示例中,返回的字符串不需要跟踪数组键。这是因为它们是数字和顺序的。
在第二个示例中,键不是顺序的,因此生成的JSON字符串需要跟踪键,以便正确解码它们。
[1, 2, 3]
等于[0 => 1, 1 => 2, 2 => 3]
。唯一的区别是显式地声明键,这是不必要的,在没有指定键时会自动完成。(总是顺序的和数字的)
另外,json_encode()
不应该返回数组或对象,它返回一个字符串。在评论中,您澄清了您的意思是"JSON对象“,但是我认为这个前提是有缺陷的,因为它从来不返回PHP数组,它总是返回一个JSON对象。结果字符串的复杂性不会改变它是一个JSON对象。
作为Miken32指出,如果您总是希望返回不太复杂(忽略键),则可以在编码之前使用array_values()
。PHP将稀疏数组视为关联数组,因此它在转换为JSON时总是会生成一个对象。
https://stackoverflow.com/questions/58845167
复制相似问题