Задать вопрос
PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как через jms/serializer десериализовать null?

Здравствуйте
использую библиотеку jms/serializer

документация вот
https://jmsyst.com/libs/serializer/master/referenc...

есть некое api оно возвращает xml
иногда так бывает что атрибут какого-то элемента не установлен
примерно так
<element id="3" zone="" period="1-2" />

у меня есть php класс, экземпляр которого я получаю десерализуя xml строку
в этом классе через аннотации мапятся свойства экземпляра на данные xml
все работает как надо НО
я имею такую конструкцию (кусочек)
/**
 * @JMS\XmlRoot("element")
 */
final class Element
{
    /**
     * @JMS\XmlAttribute()
     */
    private ?int $zone = null;
}


много опущено, но суть в том что zone="" десериализуется в 0(int)
не могу нагуглить и понять как мне объяснить сериализатору, что так делать не надо

в коде серализатора нашел
// Sometimes data can convey null but is not of a null type.
// Visitors can have the power to add this custom null evaluation
if ($this->visitor instanceof NullAwareVisitorInterface && true === $this->visitor->isNull($data)) {
 $type = ['name' => 'NULL', 'params' => []];
}


вроде как он понимает NULL но не могу найти как это описать? (как выбирается visitor)
  • Вопрос задан
  • 403 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
а как он задает приватное свойство?
типы свойств jmsyst.com/libs/serializer/master/reference/annota...
как вариант
final class Element
{
    /**
     * @XmlAttribute
     */
    private ?int $zone = null;
    public function __set(string $name, $value)
    {
           if ($name === 'zone' && $value === 0) {
                 $value = null;
           }
           $this->{$name} = $value;
    }
}

или
final class Element
{
    /**
     * @XmlAttribute
     */
    private ?int $zone = null;

    public function __get(string $name)
    {
           if ($name === 'zone' && $this->zone === 0) {
                 return null;
           }
           return $this->{$name};
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы