{0:{"id":1,...},{"id:2,....}} 是 JSON 列表的另一种表示形式,如 [{"id": 1,...},{"id:2,....}]

Is {0:{"id":1,...},{"id:2,....}} a other reprensation of a JSON list like [{"id":1,...},{"id:2,....}]

我有点进退两难。我有一个 backend/Frontend 应用程序与基于 JSON 的 REST Api.

通信

后端用PHP(Symfony/jmsserializer)写,前端用Dart

这两个之间的通信有点问题。

对于大多数列表数据,后端响应 JSON,例如

[{"id":1,...},{"id:2,....}]

但对于某些人来说,它会响应

{"0":{"id":1,...}, "1":{"id:2,....}}

现在我的问题是后端应该用后面的响应还是只用第一个响应?

问题

您通常有一个对象列表。您有时会得到一个带有子对象作为属性的对象。

潜在问题

JS/JSON-Lists 从 0 向上排序,这意味着如果您有 PHP-Array 不遵守此规则 json_encode 将输出 JS/JSON-Object 而不是使用数字索引作为键。

PHP-数组是有序映射,比 JSON-列表具有更多特征。每当您使用这些额外功能时,您将无法直接转换为 JSON-Lists 而不会丢失一些信息(排序、键、跳过的索引等)。

PHP-Arrays 和 JSON-Objects 在特征方面或多或少是等价的,并且可以在彼此之间正确转换而不会丢失任何信息。

出现次数

如果您有一个初始的 PHP-值数组,它遵守 JS/JSON-List 规则,但对象列表中的键以某种方式被修改,则会发生这种情况。例如,如果您有自定义索引顺序 {"3":{}, "0":{}, "1":{}, "2":{}} 或者如果您有(任何)键是字符串(即非数字)。

如果您想使用对象的数字 id 作为列表的数字索引,这总是会发生 {"123":{"id": 123, "name": "obj"}} 即使数字 id 是升序的...只要它们没有开始从 0 开始它不是一个 json-list 它是一个 json-object.

具体案例

所以我的猜测是后端的 PHP 代码正在做一些事情,比如获取一个对象列表,但它修改了一些东西,比如通过(字符串)键将它们插入数组,将它们插入一个特定的顺序,删除其中的一些。

分辨率

后端可以通过在使用 json_encode 之前使用 array_values($listOfObjects) 轻松解决此问题,这将通过升序值的数字索引重新索引整个列表。

数组和字典在 JSON 中是两种不同的类型(分别为 "array" 和 "object"),但是 PHP 将此功能组合在一个数组类型中。

PHP的json_encode处理如下:一个只包含数字键($array = ['cat', 'dog'])的数组被序列化为JSON数组,一个关联数组包含非数字键 ($array = ['cat' => 'meow', 'dog' => 'woof']) 的序列化为 JSON 对象,包括输出中的数组键。

如果您在 PHP 中得到一个关联数组,但想在 JSON 中将其序列化为普通数组,只需在 [=25] 之前使用它来将其转换为数值数组=] 编码:$array = array_values($array);