Symfony 2.7 dateTime反序列化

时间:2017-02-20 10:13:32

标签: json symfony serialization

我需要一些SF 2.7序列化程序的帮助

我已经使用这样获取Json Data的API:

{
"dateDebut":"2017-02-16",
"dateFin":"2018-02-16",
"caMoisTotalHorsSessions":"5.2",
"caMoisClients":"5.3",
"caMoisGarantie":"5.4",
"caMoisHuile":"5.5" }

我尝试了很多方法来反序列化到我的对象类中,其中dateDebut和dateFin属于Datetime对象而不是字符串

try {
        $encoder = new JsonEncoder();
        $normalizer = new GetSetMethodNormalizer();

        $callback = function ($date) {
            return new \DateTime($date);
        };

        $normalizer->setCallbacks(array(
            'dateDebut' => $callback,
            'dateFin' => $callback, ));

        $serializer = new Serializer(array($normalizer), array($encoder));

        $entity = $serializer->deserialize($request->getContent(), $class, $format);
    } catch (RuntimeException $e) {
        return new JsonResponse(
            ['code' => Response::HTTP_BAD_REQUEST, 'message' => $this->trans('api.message.data_error')],
            Response::HTTP_BAD_REQUEST);
    }

但回调从未使用过:/有人可以帮我吗?

目标是在刷新数据库中的对象之前自动将日期字符串转换为Datetime对象。

非常感谢

2 个答案:

答案 0 :(得分:1)

您要做的是非规范化。规范化器回调用于规范化。我认为这很令人困惑。奇怪的是,他们只为一个方向提供设置回调。

我测试了一些我认为你想做的代码。您需要一个自定义规范化器类。该类不是那么复杂,它可以从GetSetNormalizer或ObjectNormalizer扩展。你只想在这里创建\ DateTime,你可以为日期时间添加一些验证。

class BoardNormalizer extends GetSetMethodNormalizer
{
    public function denormalize($data, $class, $format = null, array $context = array())
    {
        if (isset($data['created'])) {
            $data['created'] = new \DateTime($data['created']);
        }

        return parent::denormalize($data, $class, $format, $context);
    }
}

我用这段代码测试了它:

    $json = json_encode([
        'created' => '2017-02-20T05:49:51-0500'
    ]);

    $encoder = new JsonEncoder();
    $normalizer = new MyCustomNormalizer();
    $serializer = new Serializer([$normalizer], [$encoder]);

    $entity = $serializer->deserialize($json, MyCustomClass::class, 'json');

它产生了我的自定义类,其中created属性是\ DateTime对象。

答案 1 :(得分:0)

目标是在刷新数据库中的对象之前自动将日期字符串转换为Datetime对象。

这样的东西?使用setter / getters?我在实体

中使用以下代码
private $created;
public function setCreated($created)
{
    if (!($created instanceof \DateTime)) {
        $created = date_create($created);
    }
    $this->created = $created;

    return $this;
}