首页 > 解决方案 > php反序列化不会反序列化完整的json并且没有错误消息

问题描述

我基于从 API 获得的 JSON 创建了一个类。API 是用 c# 编写的,所以我不能从那个类中复制,因为它主要是列表。

这就是 JSON 的样子。

    {"Columns":[{"ColumnNumber":0,"ColumnName":"NAME","DataType":"string"},{"ColumnNumber":1,"ColumnName":"PK_R_RELATION","DataType":"int"}]}
    

这是我班上的 var_dump()。

object(Table)#1250 (2) {
  ["Columns":"Table":private]=>
  array(1) {
    [0]=>
    object(Column)#1221 (0) {
      ["ColumnNumber":"Column":private]=>
      uninitialized(int)
      ["ColumnName":"Column":private]=>
      uninitialized(string)
      ["DataType":"Column":private]=>
      uninitialized(string)
    }
  }

它实际上是相同的,但(Symfony 序列化器)解串器不会将数据放入类中。当我将第二张图片中看到的“object(Column)#1221”设为数组时,它一切正常,但不是这样。我认为这个问题与我的规范器/提取器有关,但我不确定。

$encoder = [new JsonEncoder()];
$extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);
$normalizer = [new ArrayDenormalizer(), new ObjectNormalizer(null, null, null, $extractor)];
$this->serializer = new Serializer($normalizer, $encoder);

public static function deserialize($data, string $type)
    {
        return JsonHelper::getInstance()->serializer->deserialize($data, $type, self::format);
    }

有什么方法可以排除故障或从反序列化方法中获取错误消息?

标签: phpsymfonyooperror-handlingdeserialization

解决方案


你注释了你的 PHPTable类吗?尝试了您的示例:

class Table
{

    /**
     * @var Column[]
     */
    private array $Columns;

    /**
     * @return Column[]
     */
    public function getColumns(): array
    {
        return $this->Columns;
    }

    /**
     * @param Column[] $Columns
     */
    public function setColumns(array $Columns): void
    {
        $this->Columns = $Columns;
    }
}
class Column
{
    private $ColumnNumber;
    private $ColumnName;
    private $DataType;

    /**
     * @return mixed
     */
    public function getColumnNumber()
    {
        return $this->ColumnNumber;
    }

    /**
     * @param mixed $ColumnNumber
     */
    public function setColumnNumber($ColumnNumber): void
    {
        $this->ColumnNumber = $ColumnNumber;
    }

    /**
     * @return mixed
     */
    public function getColumnName()
    {
        return $this->ColumnName;
    }

    /**
     * @param mixed $ColumnName
     */
    public function setColumnName($ColumnName): void
    {
        $this->ColumnName = $ColumnName;
    }

    /**
     * @return mixed
     */
    public function getDataType()
    {
        return $this->DataType;
    }

    /**
     * @param mixed $DataType
     */
    public function setDataType($DataType): void
    {
        $this->DataType = $DataType;
    }


}
public function testDeserialize(): Table {
    $json = '{"Columns":[{"ColumnNumber":0,"ColumnName":"NAME","DataType":"string"},{"ColumnNumber":1,"ColumnName":"PK_R_RELATION","DataType":"int"}]}';
    $encoder = [new JsonEncoder()];
    $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);
    $normalizer = [new ArrayDenormalizer(), new ObjectNormalizer(null, null, null, $extractor)];
    $serializer = new Serializer($normalizer, $encoder);
   return $serializer->deserialize($json,Table::class,'json');
}

我得到了这个结果:

App\Serialize\Table {#6385 ▼
  -Columns: array:2 [▼
    0 => App\Serialize\Column {#3274 ▼
      -ColumnNumber: 0
      -ColumnName: "NAME"
      -DataType: "string"
    }
    1 => App\Serialize\Column {#666 ▼
      -ColumnNumber: 1
      -ColumnName: "PK_R_RELATION"
      -DataType: "int"
    }
  ]
}

问题是反序列化器不知道数组中的数据类型。使用该提取器,它将读取注释并拥有完成工作的所有信息。


推荐阅读