diff --git a/src/Utils/DateDeserializationSubscriber.php b/src/Utils/DateDeserializationSubscriber.php new file mode 100644 index 0000000..b861ebb --- /dev/null +++ b/src/Utils/DateDeserializationSubscriber.php @@ -0,0 +1,35 @@ + 'serializer.pre_deserialize', + 'method' => 'onPreDeserialize', + 'format' => 'json', + ], + ]; + } + + public function onPreDeserialize(PreDeserializeEvent $event) + { + $data = $event->getData(); + $type = $event->getType(); + + if ($type['name'] === 'DateTime') { + $truncatedDatetime = preg_replace('/(\.\d{6})\d+Z$/', '$1Z', $data); + $event->setData($truncatedDatetime); + } + + if ($data === "0001-01-01T00:00:00Z") { + $event->setData("0001-01-01T00:00:00.000000Z"); + } + } +} diff --git a/src/Utils/JSON.php b/src/Utils/JSON.php index 7ef4ca7..f758253 100644 --- a/src/Utils/JSON.php +++ b/src/Utils/JSON.php @@ -8,6 +8,7 @@ namespace Ding\DingSDK\Utils; +use JMS\Serializer\EventDispatcher\EventDispatcher; use JMS\Serializer\Handler\HandlerRegistry; use JMS\Serializer\SerializerBuilder; @@ -20,6 +21,10 @@ static function (HandlerRegistry $registry): void { $registry->registerSubscribingHandler(new MixedJSONHandler()); $registry->registerSubscribingHandler(new EnumHandler()); }, - )->addDefaultHandlers()->build(); + )->addDefaultHandlers() + ->configureListeners(function(EventDispatcher $dispatcher) { + $dispatcher->addSubscriber(new DateDeserializationSubscriber()); + }) + ->build(); } } \ No newline at end of file