Исключить нулевые свойства в JMS Serializer

Мой использованный XML API имеет возможность получать только части ответа.
Это приводит к тому, что результирующий объект имеет много NULL свойства, если эта функция используется.
Есть ли способ на самом деле пропустить NULL свойства? Я пытался реализовать стратегию исключения с

shouldSkipProperty(PropertyMetadata $property, Context $context)`

но я понял, что нет способа получить доступ к текущему значению свойства.

Примером будет следующий класс

class Hotel {
/**
* @Type("string")
*/
public $id;

/**
* @Type("integer")
*/
public $bookable;

/**
* @Type("string")
*/
public $name;

/**
* @Type("integer")
*/
public $type;

/**
* @Type("double")
*/
public $stars;

/**
* @Type("MssPhp\Schema\Response\Address")
*/
public $address;

/**
* @Type("integer")
*/
public $themes;

/**
* @Type("integer")
*/
public $features;

/**
* @Type("MssPhp\Schema\Response\Location")
*/
public $location;

/**
* @Type("MssPhp\Schema\Response\Pos")
*/
public $pos;

/**
* @Type("integer")
*/
public $price_engine;

/**
* @Type("string")
*/
public $language;

/**
* @Type("integer")
*/
public $price_from;
}

который десериализует в этом конкретном вызове API для следующего объекта с большим количеством null свойства.

"hotel": [
{
"id": "11230",
"bookable": 1,
"name": "Hotel Test",
"type": 1,
"stars": 3,
"address": null,
"themes": null,
"features": null,
"location": null,
"pos": null,
"price_engine": 0,
"language": "de",
"price_from": 56
}
]

Но я хочу, чтобы это было

"hotel": [
{
"id": "11230",
"bookable": 1,
"name": "Hotel Test",
"type": 1,
"stars": 3,
"price_engine": 0,
"language": "de",
"price_from": 56
}
]

2

Решение

Вы можете настроить JMS Serializer для пропуска null свойства вроде так:

$serializer = JMS\SerializerBuilder::create();
$serializedString = $serializer->serialize(
$data,
'xml',
JMS\SerializationContext::create()->setSerializeNull(true)
);

Взято из Эта проблема.

ОБНОВИТЬ:

К сожалению, если вам не нужны пустые свойства при десериализации, нет другого способа, кроме как удалить их самостоятельно.

Тем не менее, я не уверен, что ваш вариант использования для фактического желания удалить эти свойства, но это не похоже на Hotel класс содержит много логики. В этом случае мне интересно, должен ли результат вообще быть классом?

Я думаю, что было бы более естественно представить данные в виде ассоциативного массива вместо объекта. Конечно, JMS Serializer не может десериализовать ваши данные в массив, поэтому вам понадобится объект передачи данных.

Достаточно добавить dumpArray а также loadArray методы к вашему существующему Hotel учебный класс. Они будут использоваться для преобразования данных в желаемый результат и наоборот. Есть твой DTO.

/**
* Sets the object's properties based on the passed array
*/
public function loadArray(array $data)
{
}

/**
* Returns an associative array based on the objects properties
*/
public function dumpArray()
{
// filter out the properties that are empty here
}

Я считаю, что это самый чистый подход, и он может отражать то, что вы пытаетесь сделать больше.

Надеюсь, это поможет.

3

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

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

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