2

我正在使用返回 XML 的 API。我可以使用 API 检索一个或多个帐户。我正在使用Jms 序列化器将这些数据反序列化为简单的模型类来保存数据。

一个帐户看起来像

<account href="https://your-subdomain.recurly.com/v2/accounts/1">
  ...
  <account_code>1</account_code>
  <state>active</state>
  <username nil="nil"></username>
  <email>verena@example.com</email>
  <first_name>Verena</first_name>
  <last_name>Example</last_name>
  ...
  <address>...</address>
</account>

我设法Account按如下方式配置我的对象,在反序列化时效果很好:

<?php
namespace Recurly\Model;
use JMS\Serializer\Annotation as JMS;

/**
* @JMS\XmlRoot("account")
*/
class Account
{
    /** @JMS\Type("string") */
    protected $account_code;
    /**  @JMS\Type("string") */
    protected $state;
    /** @JMS\Type("string") */
    protected $username;
    /** @JMS\Type("string") */
    protected $email;
    /** @JMS\Type("string") */
    protected $first_name;
    /** @JMS\Type("string") */
    protected $last_name;
    /** @JMS\Type("string") */
    protected $company_name;
    /** @JMS\Type("string") */
    protected $vat_number;
    /** @JMS\Type("Model\Address") */
    protected $address;
    /** @JMS\Type("string") */
    protected $accept_language;
    /** @JMS\Type("string") */
    protected $hosted_login_token;
    /** @JMS\Type("DateTime") */
    protected $created_at;

    // getters and setters here
}

现在,当我获得多个帐户时,它看起来像这样:

<accounts type="array">
  <account href="https://your-subdomain.recurly.com/v2/accounts/1">...</account>
  <account href="https://your-subdomain.recurly.com/v2/accounts/2">...</account>
  <account href="https://your-subdomain.recurly.com/v2/accounts/3">...</account>
</accounts>

我想将其反序列化为一组帐户。然而,目前,我发现唯一能做到这一点的方法是创建第二个名为的模型Accounts,如下所示:

<?php
namespace Recurly\Model;
use JMS\Serializer\Annotation as JMS;

class Accounts 
{
    /**
     * @var Account[]
     *
     * @JMS\Type("array<Recurly\Model\Account>")
     * @JMS\XmlList(entry="account")
     */
    protected $accounts;

    // getters and setters here
}

反序列化时,我必须传递正确的上下文:

$serializer->deserialize($rawXml, 'Recurly\Model\Account', 'xml'); // or Recurly\Model\Accounts if I get multiple.

我在某个地方(在 SO 问题或 JMS Serializer Github 上)发现您也可以将“类型”作为上下文传递,$serializer->deserialize($rawXml, 'array<Recurly\Model\Account>', 'xml')但这只会导致一个空数组......任何人都知道是否可以在没有额外的情况下反序列化数组数据模型?

4

1 回答 1

1

您可以通过调整 xml 结构来使用 $serializer->deserialize($rawXml, 'array', 'xml') (结果和条目是默认值)。反序列化中有第 4 个参数 - $context 它可以重新定义默认值,但我找不到方法。

<result>
    <entry>
        <account_code>1</account_code>
        <state>active</state>
        <username nil="nil"></username>
        <email>verena@exampl.com</email>
        <first_name>Verena</first_name>
        <last_name>Example</last_name>
    </entry>
    <entry>
        <account_code>1</account_code>
        <state>active</state>
        <username nil="nil"></username>
        <email>verena@exampl.com</email>
        <first_name>Verena</first_name>
        <last_name>Example</last_name>
    </entry>
</result>
于 2013-12-17T14:17:20.780 回答