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

Php Symfony序列化程序返回字符串而不是浮点,php,json,symfony,serialization,Php,Json,Symfony,Serialization,如何配置Symfony序列化程序组件以规范化对象(实体)的浮点属性 详细说明:条令实体的taxRate属性映射到PHP浮点值。我想从一个具有JSON表示的控制器响应,如: {taxRate:0.19} 但我得到的是 {taxRate:"0.19"} 实体属性和注释的定义如下: class ExampleEntity { /** * @ORM\Column(type="decimal", precision=3, scale=2, nullable=true) * @Group

如何配置Symfony序列化程序组件以规范化对象(实体)的浮点属性

详细说明:条令实体的
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端将字符串转换为浮点的解决方案。我的应用程序希望断言属性为NULL或浮点值


如何做到这一点?

多亏了这些评论,我认为这个问题不是很清楚/可以删除

序列化过程很好,这是我没有正确理解的原则的映射

这完全没问题,DECIMAL/MySQL类型映射到PHP字符串。
十进制是为了保证数值的精度而设计的。PHP的浮点类型不能保证相同的精度

我对Symfony 4.4 serializer也有同样的问题,我不同意您的解决方案。我通过将type=“decimal”更改为type=“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;
}

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

有关此方法的一些附加信息:

/**
 * @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;
}
  • 如果您使用服务容器很好地实例化了ORM注释,那么Symfony序列化程序将读取ORM注释
  • SyfOffice序列化器完全考虑浮动作为浮动
  • 信条需要一个浮点精度,PHP不需要,这是完全可以的。您可以在数据库中插入一个浮点数,必要时规则将对其进行取整
序列化程序的浮点属性示例:

/**
 * @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;
}

对于decimal类型,从数据库检索的值总是转换为PHP的字符串类型,如果没有数据,则转换为null

如果要使用decimal,请更改getter for属性

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

try
type=“float”
@sietse85
type=“float”
将是orm映射配置。。。symfony序列化程序没有考虑到这一点。真的吗?我试过了,效果很好。这在哪里有记录?因为那个注释是为了教义,对吧?2.我认为十进制更安全,因为MySQL浮点类型需要PHP语言环境使用“.”作为浮点分隔符,但情况并非总是如此。3.非常感谢。4.有没有办法坚持十进制并实现到浮点/双精度的转换?(这就是我一直认为的)@nifr你是对的。但是由于sietse85的评论,我意识到“错误”的转换发生在序列化之前。我不知道DECIMAL被映射/转换为PHP字符串。是我的错。现在我对这个事实有点不高兴:)好的。您可以将
GetSetMethodNormalizer
public function getTaxRate():float{return(float)$this->taxRate;}
public function setTaxRate($taxRate){$this->taxRate=(float)$taxRate;}
一起使用来防止这些转换问题。