Я использую API, который возвращает XML. Я могу получить одну или несколько учетных записей с API. Я использую JMS Serializer для десериализации этих данных в простые классы моделей, которые будут хранить данные.
Учетная запись выглядит так:
<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')
но это просто приводит к пусту массива … Кто-нибудь знает, можно ли десериализовать массив без дополнительной модели данных?
Вы можете использовать $ serializer-> deserialize ($ rawXml, 'array', 'xml'), настроив структуру xml (результат и запись являются значениями по умолчанию). В deserialize – $ context есть 4-й параметр, он может переопределять значения по умолчанию, но я не могу найти способ как.
<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>