是{0:{“id”:1,...},{“id:2,....}} JSON列表的另一个代表,如[{”id“:1,...},{ “ID:2,...}]

时间:2015-05-06 08:27:29

标签: json symfony dart fosrestbundle

我有点困惑。我有一个后端/前端应用程序,它与基于JSON的REST Api通信。

后端用PHP(Symfony / jmsserializer)和Dart前端

编写

这两者之间的沟通有一点问题。

对于大多数列表数据,后端以类似

的JSON响应
[{"id":1,...},{"id:2,....}]

但对某些人来说,它以

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

现在我的问题是,后端是应该用后者还是仅用第一个来回应?

2 个答案:

答案 0 :(得分:3)

问题

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

基础问题

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

PHP-Arrays是有序的地图,具有JSON列表的更多功能。每当您使用这些额外功能时,您都无法直接转换为JSON列表而不会丢失某些信息(排序,键,跳过的索引等)。

另一方面,PHP-Arrays和JSON-Objects在功能方面更不等同,可以在彼此之间正确转换而不会丢失任何信息。

Occurence

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

如果你想使用对象的数字id作为列表{"123":{"id": 123, "name": "obj"}}的数字索引,即使数字ID是按升序排列的......只要它们不是从0开始,就会发生这种情况。向上它不是json-list它是一个json-object。

具体案例

所以我的猜测是后端的PHP代码正在执行类似于获取对象列表的操作,但是它修改了一些内容,比如将它们(字符串)键插入到数组中,按特定顺序插入它们,删除一些他们。

分辨率

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

答案 1 :(得分:2)

数组和字典是JSON中的两个独立类型(分别是“数组”和“对象”),但PHP将此功能组合在一个数组类型中。

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

如果您最终在PHP中使用关联数组,但希望将其序列化为JSON中的普通数组,则只需使用它将其转换为数字数组,然后再对其进行JSON编码:$array = array_values($array);