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