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

使用Argument Resolver反序列化请求得到空UpdateAreaModes对象,求解决

问题原因与解决方案

问题根源

你的请求JSON是直接的数组结构:

[{"type": "SomeType", "value": "someValue"}]

但你要反序列化的UpdateAreaModes类是一个包含modes数组字段的对象,序列化器期望的JSON结构应该是对象格式:

{
  "modes": [{"type": "SomeType", "value": "someValue"}]
}

两者结构不匹配,导致序列化器无法将请求的数组内容映射到UpdateAreaModes的modes属性,最终得到空对象。

解决方案

有两种可行处理方式,按需选择:

方式一:调整请求JSON结构

将请求内容修改为符合UpdateAreaModes结构的对象格式,这样你现有的Argument Resolver代码就能正常工作。

方式二:修改Argument Resolver的反序列化逻辑

如果无法修改请求结构,可在Resolver里手动适配结构后再反序列化:

public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
    // 把请求数组包装成包含modes字段的对象结构
    $wrappedData = [
        'modes' => json_decode($request->getContent(), true)
    ];
    yield $this->serializer->deserialize(json_encode($wrappedData), UpdateAreaModes::class, BaseResolver::JSON);
}

或者直接分步反序列化并构建对象:

public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
    // 先把请求数组反序列化为ModeDTO数组
    $modeDTOs = $this->serializer->deserialize(
        $request->getContent(),
        'array<ModeDTO>',
        BaseResolver::JSON
    );
    // 手动构建UpdateAreaModes对象并赋值
    $updateAreaModes = new UpdateAreaModes();
    $updateAreaModes->modes = $modeDTOs;
    yield $updateAreaModes;
}

额外注意:确保你的序列化器(如Symfony Serializer)已正确配置DTO支持,比如启用PropertyInfo组件识别属性类型,或通过注解明确字段映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:55:20