PHP中的json_decode函数在返回数组时是否保证元素的顺序不变?

8
你可以向 json_decode 传递一个布尔值,以返回数组而不是对象。
json_decode('{"foo", "bar", "baz"}', true);  // array(0 => 'foo', 1 => 'bar', 2 => 'baz')

我的问题是:当解析对象字面量时,是否保证项目的顺序不变?我知道JSON对象属性没有顺序,但PHP数组有。我在PHP手册中找不到明确解释这一点的地方。可能更谨慎一些会更好,但如果可能的话,我想避免包含某种“索引”子属性。

"JSON对象属性没有顺序" - 我认为你指的是在Javascript中解释时。我认为它们是有序的,除非你使用了一个对象作为键(在Javascript中;不能在PHP中这样做,也不能在JSON中表示)。 - artfulrobot
4个回答

4

在这种情况下,将JSON传递给PHP时使用数组会更有意义。如果JSON中没有任何对象键(它们在PHP中成为关联数组键),只需将其作为数组发送即可。这样,您可以保证它们在PHP中与javascript中的顺序相同。

json_decode('{["foo", "bar", "baz"]}');
json_decode('["foo", "bar", "baz"]'); //I think this would work

如果您需要关联数组(这就是为什么要将第二个参数传递为true的原因),则在传递时必须想出一些方法来维护它们的顺序。在解码后,您可能需要对生成的数组进行一些后处理,以便按照所需格式进行格式化。
$json = '{[ {"key" : "val"}, {"key" : "val"} ]}';
json_decode($json, true);

我找不到排序的任何确认,所以我必须自己确保它们已经排序。谢谢。 - Marco

2
个人而言,我从不相信任何系统能够返回一个确切的顺序,除非该顺序是明确定义的。如果您真的需要一个顺序,请使用字典(也称为二维数组),并为列表中的每个值分配一个位置值(0、1、2、3等)。
如果您将此规则应用于所有内容,则无论该数组的传递/存储方式是XML、JSON还是数据库,您都不必担心它。
请记住,仅因为某些事情以某种方式运作,并不意味着它有意这样做。这类似于认为数据库中的行具有顺序,实际上除非使用ORDER BY子句,否则它们并没有顺序。想要在SELECT语句中ID 1总是出现在ID 2之前是不安全的。

1

我曾多次使用json_decode(),并且在PHP客户端应用程序中结果顺序保持不变。但是例如在Python中,它不能保留顺序。

要确保的一种方法是使用多个示例进行测试。


很好,你测试通过了,但你永远不知道更新会改变这个顺序,宁可安全也不要抱有侥幸心理,如果你需要一个顺序,请设定一个顺序。 - TravisO
是的,你说得完全正确,但他提到JSON没有键,所以没有太多选择,只能依靠PHP的方式来处理,除非他使用关联数组。 - rogeriopvl

1

缺乏明确的说明,我会说,根据定义,没有明确的顺序将被保留。

我的主要思路是,这个顺序到底是什么?json_decode函数以javascript对象文字的字符串表示作为参数,然后返回一个对象或数组。该函数的输入(对象文字作为字符串)没有明确的排序,这意味着json_decode函数没有清晰的顺序可维护。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接