我有点困惑。我有一个后端/前端应用程序,它与基于JSON的REST Api通信。
后端用PHP(Symfony / jmsserializer)和Dart前端
编写这两者之间的沟通有一点问题。
对于大多数列表数据,后端以类似
的JSON响应[{"id":1,...},{"id:2,....}]
但对某些人来说,它以
回应{"0":{"id":1,...}, "1":{"id:2,....}}
现在我的问题是,后端是应该用后者还是仅用第一个来回应?
答案 0 :(得分:3)
您通常有一个对象列表。有时你会得到一个带有子对象作为属性的对象。
JS / JSON-Lists从0向上排序,这意味着如果你有不遵守这个规则的PHP-Array json_encode
将使用数字索引作为键输出JS / JSON-Object。 / p>
PHP-Arrays是有序的地图,具有JSON列表的更多功能。每当您使用这些额外功能时,您都无法直接转换为JSON列表而不会丢失某些信息(排序,键,跳过的索引等)。
另一方面,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代码正在执行类似于获取对象列表的操作,但是它修改了一些内容,比如将它们(字符串)键插入到数组中,按特定顺序插入它们,删除一些他们。
后端可以在使用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);