JMS将ArrayCollection序列化为对象

时间:2015-06-13 17:43:33

标签: json symfony serialization jmsserializerbundle

我正在使用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
      }
   ]
}

有任何线索吗?

2 个答案:

答案 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 ArrayObject

如果数组中的单元格是null,它将首先跳过该单元格,跳过它会使索引停止,序列化程序会将其识别为关联数组。

array:28 [
  0 => "High Fashion"
  1 => "Contemporary"
  2 => "Streetwear"
  3 => null
  4 => "Grooming"
]

由于$arr[3]为空,因此会跳过。一旦跳过,索引就会停止。 => Serializer将其视为关联数组。

此案例的解决方案:

首先删除空单元格,然后获取数组值并序列化 array_values(array_filter($resources))