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将单个字符串值包装为数组:
- 创建自定义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); } }
- 在
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
相关产品推荐
相关产品推荐

