【问题标题】:Using JMSSerializer with XmlKeyValuePairs annotation使用带有 XmlKeyValuePairs 注释的 JMSSerializer
【发布时间】:2015-11-21 23:12:32
【问题描述】:

我正在尝试在 Symfony2 上使用 FOSRestBundle 和 JMSSerializerBundle 构建 API。我成功地用 json 输出完美地运行它。但是 XML 输出不好。它运行,生成一个 XML 数据,但是由于 xml 标记名称,数据是无用的。

控制器的 PHP 代码:

use JMS\Serializer\Annotation;

....
....
....

/**
 * Version
 * @return Response
 *
 * @Annotation\XmlKeyValuePairs
 *
 * @ApiDoc(
 *  resource=true,
 *  description="Method for API Version",
 *  statusCodes={
 *      200="Success"
 *  },
 *  parameters={
 *  }
 * )
 */
public function versionAction () {
    $response = [
        'code'    => 200,
        'message' => 'api version',
        'data'    => [
            'version'    => '0.0.1',
            'lastupdate' => '2015-11-21 23:29:00',
            'now'        => (new \DateTime())->format('Y-m-d H:i:s')
        ]
    ];

    return $response;
}

XML 输出:

<?xml version="1.0" encoding="UTF-8"?>
<result>
  <entry>200</entry>
  <entry><![CDATA[api version]]></entry>
  <entry>
    <entry><![CDATA[0.0.1]]></entry>
    <entry><![CDATA[2015-11-21 23:29:00]]></entry>
    <entry><![CDATA[2015-11-22 00:41:30]]></entry>
  </entry>
</result>

这里的问题是 XML 标记都是“条目”。我想要的是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<result>
  <code>200</code>
  <message>api version</message>
  <data>
    <version>0.0.1></version>
    <lastupdate>2015-11-21 23:29:00</lastupdate>
    <now>2015-11-22 00:41:30</now>
  </data>
</result>

我正在使用@Annotation\XmlKeyValuePairs,如文档所述,但无法获得我想要的结果。 here 上有一个解决方案,它正在工作,但这不是一个好的解决方案,因为文件来自作曲家。

我不知道我是否遗漏了什么,或者是 JMSSerializerBundle 或 Symfony2 中的错误,还是我必须使用另一个注释才能使 XmlKeyValuePairs 正常工作?

【问题讨论】:

  • 顺便说一下,我可以使用@XmlAttributeMap 注解,用于&lt;result name="version" value="0.0.1"/&gt; 输出。但它也不起作用。

标签: php xml symfony fosrestbundle jmsserializerbundle


【解决方案1】:

看看类似https://github.com/schmittjoh/JMSSerializerBundle/issues/59#issuecomment-374888667 这对我来说是个大问题

<?php

namespace Ekv\System\Tmp\JmsSerializer;

use Doctrine\Common\Annotations\AnnotationRegistry;
use JMS\Serializer\Annotation\XmlKeyValuePairs;
use JMS\Serializer\Annotation\XmlList;
use JMS\Serializer\Annotation\XmlRoot;

/** @XmlRoot("api_result") */
class JmsXmlSerModel
{
    /**
     * @var array
     * @XmlList(inline = true, entry = "item")
     * @XmlKeyValuePairs
     */
    private $array = array(
        'key-one' => 'foo',
        'key-two' => 1,
        'nested-array' => array(
            'bar' => 'foo',
        ),
        'without-keys' => array(
            1,
            'test'
        ),
        'mixed' => array(
            'test',
            'foo' => 'bar',
            '1_foo' => 'bar'
        ),
        1 => 'foo'
    );

    public function __construct($inArr)
    {
        $this->array = $inArr;
        $this->init();
    }

    protected function init()
    {
        new XmlRoot();
        new XmlList();
        new XmlKeyValuePairs();
//      https://stackoverflow.com/q/14629137/1101589
//        \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace(
//            'JMS\Serializer\Annotation',
//            PATH_ROOT.'/vendor/jms/serializer/src'
//        );
    }

    public static function usage($inputArray)
    {
        $serializer = \JMS\Serializer\SerializerBuilder::create()->build();
        $xml = $serializer->serialize(new self($inputArray), 'xml');
        //pa($res);
        pa($xml);exit;
    }
}

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2016-07-19
    • 2018-12-29
    • 2016-04-05
    相关资源
    最近更新 更多