JMSSerializerBundle Показать пустое значение вместо нулевого значения

Мы используем Symfony2 FOSRestBundle с JMSSerializerBundle для разработки REST API для мобильных разработчиков.

Ответ API в формате JSON возвращает «null» в качестве значения свойств, где это применимо, что создает исключение для сторонней библиотеки, используемой разработчиками мобильных устройств.

Я не вижу решения от JMSSerializerBundle или FOSRestBundle для перезаписи значения в соответствии с нашим требованием.

Обходной путь на данный момент Я могу установить значение по умолчанию в объекте, чтобы свежие данные имели какое-то значение по умолчанию в базе данных, а не нулевое значение. Но это не работает для объектов отношения «один к одному/многие к одному», поскольку они по умолчанию возвращают значение null вместо пустого объекта.

Любое решение перезаписать json после сериализации?


person Jeet    schedule 23.07.2015    source источник


Ответы (2)


Для этого вы можете использовать специального посетителя:

<?php

namespace Project\Namespace\Serializer;

use JMS\Serializer\Context;
use JMS\Serializer\JsonSerializationVisitor;

class BlankSerializationVisitor extends JsonSerializationVisitor
{
    /**
     * {@inheritdoc}
     */
    public function visitNull($data, array $type, Context $context)
    {
        return '';
    }
}

А затем установите его в свой сериализатор с помощью метода setSerializationVisitor или в файле конфигурации:

# app/config/config.yml
parameters:
    jms_serializer.json_serialization_visitor.class: Project\Namespace\Serializer\BlankSerializationVisitor
person Seb33300    schedule 31.03.2016

При использовании FOSRestBundle в вашем файле конфигурации (обычно app/config/config.yml) вы можете использовать эти настройки, чтобы избежать нулевых значений:

fos_rest:
    serializer:
        serialize_null: false

Если вам нужно пользовательское значение, вы можете использовать событие serializer.post_serialize .

PS: Чтобы иметь все возможные опции, предоставляемые комплектом, введите эту команду:

php bin/console config:dump-reference fos_rest
person COil    schedule 23.07.2015
comment
Установка этого значения false полностью удалит нулевое свойство из ответа. Но нам нужно показать этот ключ с пустой строкой. - person Jeet; 23.07.2015
comment
Спасибо за обновление. Я видел, как serializer.post_serialize дает мне ObjectEvent, который раскрывает полную сущность, и я не могу узнать, какой из них является объектом (обнуляемым), был сериализован для API и должен быть установлен как пустой объект/строка. Я думаю, что мы можем добавлять новые свойства только в файл ObjectEvent. - person Jeet; 23.07.2015
comment
У меня такая же проблема. Как заменить нулевые значения пустыми строками с помощью события serializer.post_serialize? Нет доступной документации о том, как использовать ObjectEvent. - person Seb33300; 31.03.2016
comment
Эта запись находится в app/config/config.yml, если кто-то не знает. И если у вас нет этой записи, вы можете добавить ее прямо под fos_rest и, конечно же, передать ей логическое значение, хотите вы ее отображать или нет. - person Luis Milanese; 20.07.2016