我正在使用JMS Serializer。当它与Doctrine ArrayCollection类型一起使用时,JsonSerializer给出了一个不正确的数组格式。指定结果应遵循[ {}, {} ]
格式,但它会为{ 1: {}, 2: {} }
提供。
有关此方案的其他信息。它只发生在我尝试序列化包含包含ArrayCollection的对象的对象并且ArrayCollection包含第一级对象时。例如:
{
"description":"Text provided",
"date":"1434145921000",
"oid":1,
"userCreator":{
"username":"name123",
"password":"psw",
"oid":2,
"name":"the-name",
"lastname":"the-lasname",
"announcements":{
"1":{
"description":"Clases de inglés",
"date":"1434745921000",
"oid":3
},
"2":{
"description":"Reparar ordenador",
"date":"1434145921000",
"oid":5
}
}
}
}
但是,如果我直接序列化用户实体,则不会发生这种情况:
{
"username":"user1",
"password":"123",
"oid":2,
"name":"Rafael",
"lastname":"Jimenez"
"announcements":[
{
"description":"Cargar cajas a la guardilla",
"date":"1434145921000",
"oid":1
},
{
"description":"Contar césped y quitar malas hierbas",
"date":"1434745921000",
"oid":3
},
{
"description":"Reparar ordenador",
"date":"1434145921000",
"oid":5
}
]
}
有任何线索吗?
答案 0 :(得分:3)
您需要重置ArrayCollection数组中的键:
$associative = new ArrayCollection([0 => 1, 2 => 1]);
$list = new ArrayCollection($associative->getValues());
as @stof sad on github:
如果您的数组没有使用从0到count($ array)的序列编制索引 - 1,获取JS对象而不是数组是预期的 行为,因为这是关联数组需要转换的方式 到JSON。如果键不是这样的序列,那么你的数组就是一张地图,而不是一张 列表。
看看例子:
php > echo json_encode([0 => 1, 1 => 1]);
[1,1]
php > echo json_encode([0 => 1, 2 => 1]);
{"0":1,"2":1}
答案 1 :(得分:1)
我认为序列化程序会检查数组是否是数字数组,并决定将其序列化为JS Array
或Object
。
如果数组中的单元格是null
,它将首先跳过该单元格,跳过它会使索引停止,序列化程序会将其识别为关联数组。
array:28 [
0 => "High Fashion"
1 => "Contemporary"
2 => "Streetwear"
3 => null
4 => "Grooming"
]
由于$arr[3]
为空,因此会跳过。一旦跳过,索引就会停止。 => Serializer将其视为关联数组。
此案例的解决方案:
首先删除空单元格,然后获取数组值并序列化
array_values(array_filter($resources))