2017-03-14 66 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,这需要一个有效的命名空间。

在这个变化之后,我所有的数组反序列化,因为他们应该。