gpt4 book ai didi

symfony - 如何让 JMS Serializer 在反序列化 JSON 而不是强制类型时抛出异常?

转载 作者:行者123 更新时间:2023-12-04 17:33:18 27 4
gpt4 key购买 nike

我正在尝试编写一个 REST API,它使用来自 Symfony2 中 PUT 请求的 JSON。将 JSON 反序列化为实体类型的工作 - 但如果 JSON 中的属性类型与实体的相应属性不匹配,则 JMS 序列化程序似乎从 JSON 强制类型而不是抛出异常。

例如 …

{ "id" : "123" }

……会导致……
int(123)

... 如果属性(property) id在实体中定义为整数。

但我希望 JMS Serializer 抛出异常。有谁知道如何实现这一目标?

更新 2016-02-27

我发现 JMS Serializer 类型处理的一个问题是:
{ "id" : "n123" }

会导致……
int(0)

这是完全不受欢迎的。

有人可以指出我正确的方向吗?

最佳答案

getting help over at Github我想就我自己的问题分享一个答案。

解决方案的关键是使用实现 JMS\Serializer\Handler\SubscribingHandlerInterface 的自定义处理程序。 (例如 StrictIntegerHandler )。

<?php
namespace MyBundle\Serializer;

use JMS\Serializer\Context;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\JsonDeserializationVisitor;
use JMS\Serializer\JsonSerializationVisitor;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;

class StrictIntegerHandler implements SubscribingHandlerInterface
{
public static function getSubscribingMethods()
{
return [
[
'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
'format' => 'json',
'type' => 'strict_integer',
'method' => 'deserializeStrictIntegerFromJSON',
],
[
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => 'strict_integer',
'method' => 'serializeStrictIntegerToJSON',
],
];
}

public function deserializeStrictIntegerFromJSON(JsonDeserializationVisitor $visitor, $data, array $type)
{
return $data;
}

public function serializeStrictIntegerToJSON(JsonSerializationVisitor $visitor, $data, array $type, Context $context)
{
return $visitor->visitInteger($data, $type, $context);
}
}

然后,您需要将序列化程序定义为服务:
services:
mybundle.serializer.strictinteger:
class: MyBundle\Serializer\StrictIntegerHandler
tags:
- { name: jms_serializer.subscribing_handler }

然后你就可以使用类型 strict_integer :
MyBundle\Entity\MyEntity:
exclusion_policy: ALL
properties:
id:
expose: true
type: strict_integer

在 Controller 中反序列化然后照常工作。

奖励:现在使用类型验证器终于有意义了:
MyBundle\Entity\MyEntity:
properties:
id:
- Type:
type: integer
message: id {{ value }} is not an integer.

我希望这可以帮助那些有同样问题的人。

关于symfony - 如何让 JMS Serializer 在反序列化 JSON 而不是强制类型时抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35502472/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com