You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的标准输出,不属于异常;只有出现嵌套双引号时,才是重复编码的问题。

解决方案

  1. 确保传入序列化的是原始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规范的正常结果。

  2. 避免重复序列化操作
    检查业务逻辑中是否存在对$value的提前序列化(比如之前调用过json_encode()或Serializer的serialize()方法),确保传入的是未经过编码的原始对象。

  3. 简化Serializer配置
    确认你的Serializer实例没有重复注册JsonEncoder或DateTimeNormalizer,多余的配置可能导致多次编码。默认情况下,Symfony的Serializer会自动处理日期类型的归一化和JSON编码,无需重复配置。

  4. 直接获取日期字符串(若无需JSON格式)
    如果你的需求只是获取格式化后的日期字符串,而非JSON格式的输出,直接调用format()方法即可,无需使用Serializer:

    $dateStr = $value->format("Y-m-d H:i:s");
    

内容的提问来源于stack exchange,提问作者Fpasquer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:31:07