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

API Platform中Doctrine json_array类型如何存储字符串?

解决方案

你遇到的问题根源是Doctrine的json_array类型强制要求存储数组结构,但你传入的是字符串"0",API Platform的反序列化器无法自动将单个字符串转换为数组,因此抛出类型错误。以下是几种可行的解决方式:

方案1:更换Doctrine字段类型(推荐)

Symfony 4.4中json_array类型已被官方弃用,推荐使用json类型——它支持所有合法JSON值(包括字符串、数字、数组、布尔值等),无需强制数组格式。修改字段注解即可:

/**
 * @ORM\Column(name="default_value", type="json", nullable=true)
 * @Groups("my_symfony_class:read","my_symfony_class:write")
 */
private $defaultValue;

修改后,传入的字符串"0"会被正确反序列化并存入数据库,读取时也能正常返回原数据。

方案2:自定义反序列化逻辑(保留json_array时使用)

如果必须保留json_array类型,可以通过自定义Normalizer将单个字符串值包装为数组:

  1. 创建自定义Normalizer类:
// src/Serializer/DefaultValueNormalizer.php
namespace App\Serializer;

use App\Entity\MySymfonyClass;
use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;

class DefaultValueNormalizer implements ContextAwareDenormalizerInterface
{
    private $decorated;

    public function __construct(DenormalizerInterface $decorated)
    {
        $this->decorated = $decorated;
    }

    public function supportsDenormalization($data, string $type, string $format = null, array $context = []): bool
    {
        return $type === MySymfonyClass::class 
            && isset($context['groups']) 
            && in_array('my_symfony_class:write', $context['groups']);
    }

    public function denormalize($data, string $type, string $format = null, array $context = [])
    {
        // 检测到defaultValue为非数组字符串时,自动包装为数组
        if (isset($data['defaultValue']) && is_string($data['defaultValue'])) {
            $data['defaultValue'] = [$data['defaultValue']];
        }

        return $this->decorated->denormalize($data, $type, $format, $context);
    }
}
  1. 在config/services.yaml中注册该Normalizer,确保优先级高于默认序列化器:
services:
    App\Serializer\DefaultValueNormalizer:
        decorates: 'api_platform.jsonld.normalizer.item'
        arguments: ['@App\Serializer\DefaultValueNormalizer.inner']
        tags:
            - { name: serializer.normalizer, priority: 100 }

方案3:调整请求数据格式

如果前端可以修改请求内容,直接传入数组格式的值即可,比如将请求体改为:

{"defaultValue": ["0"]}

内容的提问来源于stack exchange,提问作者L.A. Rabida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:31:02