2017-03-14 70 views
0

我需要反序列化下面的XML到一個對象圖:JMS串行軟件包:反序列化XML到嵌套對象

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <result> 
     <success>true</success> 
     <item> 
      <id>1</id> 
      <name>foo</name> 
     </item> 
     <item> 
      <id>2</id> 
      <name>bar</name> 
     </item> 
    </result> 
    <metadata> 
     <key1>value1</key1> 
     <key2>value2</key2> 
    </metadata> 
</response> 

應該有3個連接的類:

class Response 
{ 
    /** 
    * @var Result 
    * 
    * @Serializer\Type("AcmeBundle\Model\Result") 
    */ 
    protected $result; 

    /** 
    * @var array 
    * 
    * @Serializer\Type("array<string, string>") 
    */ 
    protected $metadata; 
} 

class Result 
{ 
    /** 
    * @var boolean 
    * 
    * @Serializer\SerializedName("success") 
    * @Serializer\Type("boolean") 
    */ 
    protected $success; 

    /** 
    * @var Item[] 
    * 
    * @Serializer\SerializedName("item") 
    * @Serializer\Type("array<AcmeBundle\Model\Item>") 
    */ 
    protected $items = array(); 
} 

class Item 
{ 
    /** 
    * @var int 
    * 
    * @Serializer\SerializedName("id") 
    * @Serializer\Type("integer") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @Serializer\SerializedName("name") 
    * @Serializer\Type("string") 
    */ 
    protected $name; 
} 

當我嘗試反序列化,我得到以下結果:

var_dump($serializer->deserialize($xml, Response::class, 'xml')); 

object(AcmeBundle\Model\Response)#918 (2) { 
    ["result":protected]=> 
    object(AcmeBundle\Model\Result)#933 (2) { 
    ["success":protected]=> 
    bool(true) 
    ["items":protected]=> 
    array(0) { 
    } 
    } 
    ["metadata":protected]=> 
    array(0) { 
    } 
} 

因此,有2個問題:

  1. 它不反序列化內嵌XML列表(項目)
  2. 它不反序列化「元數據」項目

任何想法如何使它在沒有手動反序列化的情況下工作?如果僅僅使用適當的註釋似乎是不可能的,任何想法如何在自定義處理程序中正確地做到這一點將非常感激。 順便說一句,從對象到XML的序列化工作正常,並生成適當的結構。

Symfony 3.2.4,JMSSerializerBundle 1.1,緩存清晰,原始的XML格式不能修改。

+0

使用@MaxDepth()註釋。 –

+0

@MathieuDormeval,它沒有任何區別:( –

+0

看看https://github.com/schmittjoh/serializer/issues/522 –

回答

2

我有類似的問題。 真正的XML是否有一個名稱空間?

<?xml version="1.0" encoding="UTF-8"?> 
<response xmlns="http://example.com/response"> 
    <result> 
     <success>true</success> 
     <item> 
      <id>1</id> 
      <name>foo</name> 
     </item> 
     <item> 
      <id>2</id> 
      <name>bar</name> 
     </item> 
    </result> 
    <metadata> 
     <key1>value1</key1> 
     <key2>value2</key2> 
    </metadata> 
</response> 

如果是這樣你需要定義命名空間類的元數據

/** 
* @Serializer\XmlNamespace(uri="http://example.com/response") 
*/ 
class Result 
{ 
[...] 
} 

對於數組串行器使用XPath,這需要一個有效的命名空間。

在這個變化之後,我所有的數組反序列化,因爲他們應該。