php 反序列化没有反序列化完整的 json 并且没有错误消息
php deserialize doesnt deserialize the full json and no error messages
我根据 API 得到的 JSON 做了一个 class。 API 是用 c# 编写的,所以我无法从 class 复制,因为它主要是列表。
这就是 JSON 的样子。
{"Columns":[{"ColumnNumber":0,"ColumnName":"NAME","DataType":"string"},{"ColumnNumber":1,"ColumnName":"PK_R_RELATION","DataType":"int"}]}
这是我 class 的 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 序列化器)反序列化器不会将数据放入 class。当我将第二张图片中看到的“object(Column)#1221”设为数组时,它一切正常,但并不希望那样。我认为问题与我的 normalizer/extractor 有关,但我不确定。
$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);
}
有什么方法可以排除故障或从反序列化方法中获取错误消息吗?
您是否注释了您的 PHP Table
class ?
用 :
试过你的例子
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"
}
]
}
问题是解串器不知道数组中的数据类型。使用该提取器,它将读取注释并将获得完成工作所需的所有信息。
我根据 API 得到的 JSON 做了一个 class。 API 是用 c# 编写的,所以我无法从 class 复制,因为它主要是列表。
这就是 JSON 的样子。
{"Columns":[{"ColumnNumber":0,"ColumnName":"NAME","DataType":"string"},{"ColumnNumber":1,"ColumnName":"PK_R_RELATION","DataType":"int"}]}
这是我 class 的 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 序列化器)反序列化器不会将数据放入 class。当我将第二张图片中看到的“object(Column)#1221”设为数组时,它一切正常,但并不希望那样。我认为问题与我的 normalizer/extractor 有关,但我不确定。
$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);
}
有什么方法可以排除故障或从反序列化方法中获取错误消息吗?
您是否注释了您的 PHP Table
class ?
用 :
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"
}
]
}
问题是解串器不知道数组中的数据类型。使用该提取器,它将读取注释并将获得完成工作所需的所有信息。