簡體   English   中英

使用JMS Serializer進行XML反序列化

[英]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元素反序列化為arrayArrayCollection或任何類型的集合,因為數組總是空的。

/**
 * @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM