Symfony 6.4.11 Serializer序列化日期出现双引号,疑重复编码求因
Symfony 6.4.11 Serializer日期序列化双引号问题解决
问题原因分析
你遇到的日期值被双引号包裹(甚至嵌套双引号),核心原因大概率是重复序列化:
- 如果传入
serialize()的$value已经是格式化后的字符串(而非原始DateTimeInterface实例),Serializer会把这个字符串再次编码为JSON字符串,导致双引号嵌套(比如""2024-05-20 12:00:00"")。 - 若Serializer配置重复添加了编码器/归一化器,也可能触发多次编码逻辑。
另外要明确:JSON语法规范中,所有字符串类型的值必须用双引号包裹,如果你得到的是"2024-05-20 12:00:00",这是JSON的标准输出,不属于异常;只有出现嵌套双引号时,才是重复编码的问题。
解决方案
确保传入序列化的是原始DateTime对象
去掉多余的字符串格式化步骤,直接传入DateTimeInterface实例:// $value 必须是 DateTime/DateTimeImmutable 实例 $json = $this->getSerializer()->serialize($value, 'json', [ DateTimeNormalizer::FORMAT_KEY => "Y-m-d H:i:s" ]);此时输出的
"2024-05-20 12:00:00"是符合JSON规范的正常结果。避免重复序列化操作
检查业务逻辑中是否存在对$value的提前序列化(比如之前调用过json_encode()或Serializer的serialize()方法),确保传入的是未经过编码的原始对象。简化Serializer配置
确认你的Serializer实例没有重复注册JsonEncoder或DateTimeNormalizer,多余的配置可能导致多次编码。默认情况下,Symfony的Serializer会自动处理日期类型的归一化和JSON编码,无需重复配置。直接获取日期字符串(若无需JSON格式)
如果你的需求只是获取格式化后的日期字符串,而非JSON格式的输出,直接调用format()方法即可,无需使用Serializer:$dateStr = $value->format("Y-m-d H:i:s");
内容的提问来源于stack exchange,提问作者Fpasquer
相关产品推荐
相关产品推荐

