php - 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);
}
有什么方法可以排除故障或从反序列化方法中获取错误消息?
解决方案
你注释了你的 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"
}
]
}
问题是反序列化器不知道数组中的数据类型。使用该提取器,它将读取注释并拥有完成工作的所有信息。
推荐阅读
- android - 部署到 Android 设备时出现 Flutter/Firebase 身份验证错误
- r - 如何根据个人添加虚拟列,然后将所有内容添加到回归中?
- c++ - 对 Class::Function 链接器错误的未定义引用
- javascript - 将数据复制并粘贴到下一个空行
- sql-server - 获取具有 UNMASK 权限的用户的屏蔽数据
- java - 当刷新令牌尝试使用 JWT (Spring Boot) 取回访问权限时,黑名单不起作用
- html - Html图像在手机上重叠
- c# - 重置倒数计时器
- c++ - XML 注释标签的 Boost Spirit Qi 规则
- javascript - 如何使用 immer 对数组进行排序?