-
-
Notifications
You must be signed in to change notification settings - Fork 9.7k
Description
Symfony version(s) affected
6.2.10 and higher
Description
The DateTimeNormalizer component throws NotNormalizableValueException if the target class contains the \DateTimeInterface property and json contains Unix timestamp.
PHP Fatal error: Uncaught Symfony\Component\Serializer\Exception\NotNormalizableValueException: The data is either not an string, an empty string, or null; you should pass a string that can be parsed with the passed format or a valid DateTime string. in /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Exception/NotNormalizableValueException.php:31 Stack trace: #0 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php(87): Symfony\Component\Serializer\Exception\NotNormalizableValueException::createForUnexpectedDataType() #1 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Serializer.php(227): Symfony\Component\Serializer\Normalizer\DateTimeNormalizer->denormalize() #2 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php(432): Symfony\Component\Serializer\Serializer->denormalize() #3 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php(598): Symfony\Component\Serializer\Normalizer\AbstractNormalizer->denormalizeParameter() #4 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php(364): Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer->denormalizeParameter() #5 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php(244): Symfony\Component\Serializer\Normalizer\AbstractNormalizer->instantiateObject() #6 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php(323): Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer->instantiateObject() #7 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Serializer.php(227): Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer->denormalize() #8 /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Serializer.php(145): Symfony\Component\Serializer\Serializer->denormalize() #9 /home/developer/symfony/serilizer-bug/serilizer-bug.php(44): Symfony\Component\Serializer\Serializer->deserialize() #10 {main} thrown in /home/developer/symfony/serilizer-bug/vendor/symfony/serializer/Exception/NotNormalizableValueException.php on line 31
How to reproduce
composer.json
{
"require": {
"symfony/serializer": "6.2.10",
"symfony/property-access": "6.2"
}
}
Reproducer
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\PropertyInfo\PropertyInfoExtractor;
use Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor;
use Symfony\Component\Serializer\Normalizer\PropertyNormalizer;
final class TestDto
{
public function __construct(
public readonly \DateTimeInterface $date,
) {
}
}
$serilizer = new Serializer(
normalizers: [
new PropertyNormalizer(
propertyTypeExtractor: new PropertyInfoExtractor(
typeExtractors: [
new ConstructorExtractor()
]
),
),
new DateTimeNormalizer(
defaultContext: [
DateTimeNormalizer::FORMAT_KEY => 'U',
]
),
],
encoders: [
new JsonEncoder()
]
);
$testDto = $serilizer->deserialize(
'{"date": 1666369508}',
TestDto::class,
'json'
);
var_dump($testDto);
Possible Solution
No response
Additional Context
No response