[英]XML deserialization with JMS Serializer
我試圖反序化這個非常簡單的XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<namespace>foo</namespace>
<resource>bar</resource>
<description>baz</description>
<arguments>
<argument>
<name>foo</name>
<type>string</type>
<description>foo</description>
</argument>
<argument>
<name>bar</name>
<type>string</type>
<description>bar</description>
</argument>
</arguments>
</root>
無論我嘗試什么,我都不能將arguments元素反序列化為array
或ArrayCollection
或任何類型的集合,因為數組總是空的。
/**
* @Type("array<Model\Argument>")
*/
private $arguments;
/**
* @Type("ArrayCollection<Model\Argument>")
*/
private $arguments;
兩者最終都是空數組。 所以我嘗試為參數創建一個單獨的對象
因此,原始財產最終成為
/**
* @Type("Model\Arguments")
*/
private $arguments;
和班級
class Arguments {
/**
* @Type("array<App\Blueprint\Model\Argument>")
*/
private $arguments;
/**
* @return mixed
*/
public function getArguments() {
return $this->arguments;
}
/**
* @param mixed $arguments
*/
public function setArguments($arguments) {
$this->arguments = $arguments;
}
}
數組仍然是空的。 但是,當我將類型更改為@Type("App\\Blueprint\\Model\\Argument")
我將獲得正確的對象,盡管只有第一個。
當我嘗試注冊反序列化處理程序時,我無法修改它,因為它是SimpleXmlElement
然后我會得到It is not yet possible to assign complex types to properties
警告...
編輯
現在我設法以一種愚蠢的方式解決它:
$registry->registerHandler(
'deserialization',
'Model\Arguments',
'xml',
function(XmlDeserializationVisitor $visitor, $data, array $type, DeserializationContext $context) {
$arguments = [];
foreach($data->children() as $child) {
$arguments[] = SerializerBuilder::create()
->build()
->deserialize($child->asXML(), 'Model\Argument', 'xml');
}
return $arguments;
}
);
如果有人有更好的解決方案,就把它留在這里。
你很親密。 您必須定義兩個單獨的類。
/**
* @Type("Model\Arguments")
*/
public $arguments;
/**
* @Type("array<Model\Argument>")
* @XmlList(inline = true, entry = "argument")
*/
public $argument;
注意Argument
類中的@XmlList
屬性。 你也可以刪除getter和setter!
為我工作,但不確定這是這樣的:
我的XML:
<activityData>
<count>1</count>
<facts>
<fact>
<dateTime year="2016" month="11" day="14" hour="0" minute="0" second="0" />
<channel>Administrator</channel>
<count>1</count>
</fact>
</facts>
</activityData>
所以我的模特:
1。
class ActivityData
{
/**
* @var ArrayCollection|ActivityDataFact[]
*
* @Serializer\Type("ArrayCollection<AppBundle\Model\ActivityDataFact>")
* @Serializer\XmlList(entry="fact")
*/
private $facts;
...
}
2。
class ActivityDataFact
{
/**
* @var DateTime
*
* @Serializer\Type("AppBundle\Model\DateTime")
* @Serializer\SerializedName("dateTime")
*/
private $date;
/**
* @var string
*
* @Serializer\Type("string")
*/
private $channel;
/**
* @var integer
*
* @Serializer\Type("integer")
*/
private $count;
...
}
3。
class DateTime
{
/**
* @var string
*
* @Serializer\Type("integer")
* @Serializer\XmlAttribute()
*/
private $year = 1970;
/**
* @var string
*
* @Serializer\Type("integer")
* @Serializer\XmlAttribute()
*/
private $month = 1;
/**
* @var string
*
* @Serializer\Type("integer")
* @Serializer\XmlAttribute()
*/
private $day = 1;
/**
* @var string
*
* @Serializer\Type("integer")
* @Serializer\XmlAttribute()
*/
private $hour = 0;
/**
* @var string
*
* @Serializer\Type("integer")
* @Serializer\XmlAttribute()
*/
private $minute = 0;
/**
* @var string
*
* @Serializer\Type("integer")
* @Serializer\XmlAttribute()
*/
private $second = 0;
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.