Сериализатор JMS не предоставляет одно свойство

Я делаю приложение RESTful с Symfony и FOSRestBundle. FOSRestBundle использует JMS Serializer для сериализации данных в формате json. У меня все работает с одной маленькой проблемой.

Это мой класс Entity

/**
 * Post
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Tomalo\AdminBundle\Entity\PostRepository")
 * @ExclusionPolicy("none")
 */
class Post
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text")
     * @Assert\NotBlank()
     */
    private $content;

    /**
     * @var float
     *
     * @ORM\Column(name="lat", type="float")
     * @Assert\NotBlank()
     */
    private $lat;

    /**
     * @var float
     *
     * @ORM\Column(name="lon", type="float")
     * @Assert\NotBlank()
     */
    private $lon;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * @var string
     *
     * @ORM\Column(name="sign", type="string", length=50, nullable=true)
     * @Expose
     */
    private $sign;

    /**
     * @var integer
     *
     * @ORM\Column(name="status", type="integer")
     */
    private $status=0;

    /**
     * @var integer
     *
     * @ORM\Column(name="points", type="integer")
     */
    private $points=0;

    /**
     * @var string
     *
     * @ORM\Column(name="uuid", type="string", length=43)
     * @Assert\NotBlank()
     * @Exclude
     */
    private $uuid;


    private $owner;


    //get/set method continue

и это json я получаю:

{
           "id": 5,
           "content": "zxcvzxcvzxc",
           "lat": 37.422005,
           "lon": -122.084095,
           "date": "2013-05-20T05:06:57+0100",
           "status": 0,
           "points": 0,
           "owner": 0
       }

В моем объекте $uuid является единственным свойством, имеющим аннотацию @Exclude, и его нет, как ожидалось, но также отсутствует свойство $sign. Как видите, я поместил аннотацию @Expose в $sign, но ничего не изменил. Я попытался использовать @ExclusionPolicy("all") и выставить все, кроме uuid, но я получаю

Warning: json_encode(): recursion detected in E:\workspace\htdocs\tomalo\vendor\jms\serializer\src\JMS\Serializer\JsonSerializationVisitor.php line 29

Я нашел некоторую информацию, так как это ошибка php

любая идея, что не так и как это исправить?


person Gustek    schedule 23.05.2013    source источник
comment
я бы порекомендовал вам настроить отображение сериализации и доктрины в отдельных файлах ( xml / yml ) вместо использования аннотаций, потому что это упрощает расширение и наследование пакетов, но это вопрос личных предпочтений ... всего несколько центов.   -  person Nicolai Fröhlich    schedule 23.05.2013
comment
Спасибо, я учту. Это действительно хорошо, Symfony предлагает несколько форматов для написания конфигурации и прочего, но это палка о двух концах.   -  person Gustek    schedule 23.05.2013


Ответы (2)


Вы можете сериализовать нули как пустые строки. Думаю, это поможет вам немного

$context = new SerializationContext();
$context->setSerializeNull(true);
$objectData = $serializer->serialize($object, 'json', $context);

Для FOSRestBundle вы можете определить это в настройках

fos_rest:
    view:
        serialize_null: true
person Alexey B.    schedule 23.05.2013
comment
Я установил serialize_null в конфигурации, но это не дало никакого эффекта. - person Gustek; 24.05.2013
comment
какую версию jms/serializer-bundle вы используете? Попробуйте сериализовать объект с помощью чистого сериализатора, как в первом примере. - person Alexey B.; 24.05.2013
comment
У меня dev-master в composer обновился только сейчас ничего не изменилось. Если я использую сериализатор напрямую, как в вашем первом примере, он работает, хотя он дает значение null в качестве значения, а не пустые строки, как я бы предпочел. Спасибо за помощь, я заставил его принять в клиенте, как сейчас, и продолжить с этим. - person Gustek; 24.05.2013
comment
Рад, что смог помочь, поэтому вы можете отметить это как ответ. Вы можете найти view_handler и посмотреть, почему не применяются настройки в FOSRestBundle. - person Alexey B.; 24.05.2013
comment
Он не работает с нулевыми значениями, для XML он использует xsi: nil, но для JSON он просто исключает нуль, как мне включить нулевые значения, в основном ключи? - person Geshan; 28.05.2013
comment
Нужно больше информации, чтобы помочь вам. Этот параметр обычно работает для json. Попробуйте с чистым сериализатором. - person Alexey B.; 28.05.2013
comment
@АлексейБ. Есть ли способ сериализовать нулевое значение в пустую строку? Мне любопытно, поскольку наши мобильные разработчики настаивают на том, чтобы сделать это для некоторых исключений, генерируемых в конце. - person Jeet; 22.07.2015
comment
@АлексейБ. возможно ли без fos_rest глобально изменить контекст, чтобы мне не нужно было указывать контекст для каждого вызова? - person lony; 01.10.2015

Решение forgottenbas для FOSRestBundle мне не подошло. Я нашел решение здесь https://github.com/FriendsOfSymfony/FOSRestBundle/pull/480.

Используйте раздел serializer в вашей конфигурации, а не view:

fos_rest:
    serializer:
        serialize_null: true
person Dmitriy    schedule 02.07.2014
comment
Спасибо, вероятно, сэкономил мне часы отладки! :-) - person Fabian Keller; 23.11.2014