Skip to content

[Serializer] DateTimeNormalizer throws exception while working with Unix timestamp #51798

Closed
@DimDev

Description

@DimDev

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions