【问题标题】:JMS Serializer Bundle: Deserialize XML to Nested ObjectsJMS Serializer Bundle:将 XML 反序列化为嵌套对象
【发布时间】:2017-03-14 09:06:54
【问题描述】:

我需要将以下 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) {
  }
}

所以有两个问题:

  1. 它不会反序列化内联 XML 列表(项目)
  2. 它不会反序列化“元数据”项

任何想法如何使其在处理程序中不进行手动反序列化的情况下工作?如果仅使用适当的注释似乎不可能,那么任何如何在自定义处理程序中正确执行此操作的想法都将不胜感激。 顺便说一句,从对象到 XML 的序列化工作正常并生成正确的结构。

Symfony 3.2.4,JMSSerializerBundle 1.1,缓存清空,无法修改原XML格式。

【问题讨论】:

标签: symfony jmsserializerbundle jms-serializer


【解决方案1】:

我遇到了类似的问题。 真正的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,它需要一个有效的命名空间。

在此更改之后,我的所有数组都按应有的方式反序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多