{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);
我有点进退两难。我有一个 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);