Symfony序列化程序返回字符串而不是浮点数

时间:2018-10-15 08:29:34

标签: php json symfony serializer

如何配置Symfony序列化器组件以规范对象(实体)的float属性?

详细信息:学说实体的taxRate属性被映射到PHP浮点值。我想用类似JSON表示的控制器响应:

{taxRate:0.19}

但是我得到的是

{taxRate:"0.19"}

实体属性和注释的定义为:

class ExampleEntity {
  /**
   * @ORM\Column(type="decimal", precision=3, scale=2, nullable=true)
   * @Groups({"api"})
   */
  protected $taxRate;
}

控制器看起来像这样:

$serializer = $this->get('serializer');
return new JsonResponse(
  $serializer->normalize(
    $exampleEntity,
    'json',
    [
      'groups' => 'api',
    ]
  )
);

我不喜欢将字符串转换为JavaScript端上的Float的解决方案。我的应用程序想断言该属性为NULL还是Float值。

这怎么办?

3 个答案:

答案 0 :(得分:1)

感谢评论,我认为问题不是很清楚/可以删除。

序列化过程很好,这是我不正确的从教义的映射。

完全没关系,DECIMAL Doctrine / MySQL类型被映射到PHP字符串。 DECIMAL旨在确保数字值的精度。 PHP的float类型不能保证相同的精度。

答案 1 :(得分:0)

我在Symfony 4.4序列化程序中遇到了同样的问题,我不同意您的解决方案。我已经通过将type =“ decimal”更改为type =“ float”解决了我的问题,正如某些人已经在评论中建议的那样。正确的类型提示是一种好习惯。为什么可以使用浮点数时使用字符串?

浮点类型,来自准则文档:

https://www.doctrine-project.org/projects/doctrine-dbal/en/2.12/reference/types.html#types

以浮点精度映射和转换数字数据。如果你 只需要分数的近似精度,您 应该考虑使用这种类型。从数据库检索的值 总是转换为PHP的float / double类型;如果没有数据,则返回null 礼物。

有关此方法的一些其他信息:

  • 如果您使用服务容器很好地实例化Symfony序列化程序,它将读取您的ORM注释
  • Symfony序列化程序完全可以将浮点数视为浮点数
  • Doctrine需要浮点数的精度,PHP不需要,并且完全可以。您可以在数据库中插入浮点数,如果需要,Doctrine将对其进行四舍五入。

序列化程序的float属性示例:

/**
 * @var float|null
 * @ORM\Column(type="float", precision=6, scale=2, nullable=true)
 */
protected $ratio;

/**
 * @return float|null
 */
public function getRatio(): ?float
{
    return $this->ratio;
}

/**
 * @param float|null $ratio
 * @return $this
 */
public function setRatio(?float $ratio): self
{
    $this->ratio = $ratio;
    return $this;
}

答案 2 :(得分:0)

对于从数据库中检索的十进制类型值,始终将其转换为PHP的字符串类型;如果不存在数据,则将其转换为null。

Doctrine Documentation

如果要使用十进制,请更改属性的吸气剂

public function getTaxRage(): ?float
{
    return is_string($this->taxRate) ? (float) $this->taxRate : $this->taxRate;
}