Заставить сериализатор JMS выводить объект, указанный в определенном поле

У меня есть объект Product с отношением "один ко многим" к объекту Property. Когда я сериализую экземпляр продукта с помощью сериализатора JMS, я получаю следующий вывод 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"
        }
    }
}

Что было бы лучшим подходом для достижения этого?


person Xatoo    schedule 20.01.2015    source источник


Ответы (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;
}

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

person Xatoo    schedule 21.01.2015