Принудительно вывести JMS Serialiser для вывода объекта, указанного в определенном поле

У меня есть сущность Товар с отношением один-ко-многим к сущности Имущество. Когда я сериализую экземпляр продукта с использованием JMS Serialiser, я получаю следующий вывод JSON:

{
"id": 123,
"name": "Mankini Thong",
"properties": [{
"label": "Minimal size",
"name": "min_size",
"value": "S"}, {
"label": "Maximum size",
"name": "max_size",
"value": "XXXL"}, {
"label": "colour",
"name": "Colour",
"value": "Office Green"}]
}

Я пытаюсь заставить сериализатор сериализовать коллекцию свойств как объект, в котором определенное поле используется в качестве ключа. Например, название поле. Желаемый результат:

{
"id": 123,
"name": "Mankini Thong",
"properties": {
"min_size": {
"label": "Minimal size",
"value": "S"},
"max_size": {
"label": "Maximum size",
"value": "XXXL"},
"colour": {
"label": "Colour",
"value": "Office Green"}
}
}

Каков наилучший подход для достижения этой цели?

1

Решение

Хорошо, я понял это:

Сначала добавьте виртуальное свойство в сопоставление сериализации и исключите исходное properties поле. Моя конфигурация в yaml, но использование аннотаций не должно отличаться:

properties:
properties:
exclude: true
virtual_properties:
getKeyedProperties:
serialized_name: properties
type: array<Foo\BarBundle\Document\Property>

Затем я добавил getKeyedProperties метод к классу документа в Foo\BarBundle\Document\Article:

/**
* Get properties keyed by name
*
* Use the following annotations in case you defined your mapping using
* annotations instead of a Yaml or Xml file:
*
* @Serializer\VirtualProperty
* @Serializer\SerializedName("properties")
*
* @return array
*/
public function getKeyedProperties()
{
$results = [];

foreach ($this->getProperties() as $property) {
$results[$property->getName()] = $property;
}

return $results;
}

Теперь сериализованный вывод содержит свойства объекта, которые являются сериализованными свойствами статьи с ключом по имени.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]