Restsharp xml Десериализация в список без изменения имени модели

У меня есть xml, который не очень хорошо сформирован, но мне нужно сопоставить список с RestSharp. У меня нет контроля над выводом службы/xml. До сих пор мне удавалось обойти проблемы с самими свойствами, используя свойство DeserializeAs(Name="name")]. Например,

public class Physician
{
    [DeserializeAs(Name = "personId")]
    public string Id { get; set; }

    [DeserializeAs(Name = "fName")]
    public string FirstName { get; set; }

    [DeserializeAs(Name = "lName")]
    public string LastName { get; set; }
}

Правильно сопоставляется со списком, когда у меня есть следующий xml:

<data>
  <physician>
    <personId>3325</personId>
    <fName>Foo</fName>
    <lName>Bar</lName>
  </physician>
  <physician>
    <personId>3342</personId>
    <fName>Jane</fName>
    <lName>Doe</lName>
  </physician>
  ...
</data>

Функция, которую я использую:

public static List<T> GetListOfEntityType<T>(string url)
{
    return Client.Execute<List<T>>(new RestRequest(url)).Data;
}

Проблема в том, что у меня есть xml, который выглядит так для ряда других запросов,

<data>
  <row>
    <typeId>0</typeId>
    <type>Physician</type>
  </row>
  <row>
    <typeId>1</typeId>
    <type>Ambulance</type>
  </row>
  ...
</data>

Учитывая, что это не очень описательный xml, но мне нужно сопоставить его со списком.

public class OrganizationType
{
    public string typeId { get; set; }
    public string type { get; set; }
}

https://stackoverflow.com/a/4082046/3443716 несколько отвечает на это, и это, безусловно, работает, но я не хочу, чтобы модель называлась row Я пытался сделать так:

[DeserializeAs(Name = "row")]
public class OrganizationType
{
    public string typeId { get; set; }
    public string type { get; set; }
}

Однако RestSharp полностью игнорирует этот атрибут. Я искал тонну и нашел несколько ответов, которые предлагают использовать собственный десериализатор, но мне трудно поверить, что это единственный или самый простой вариант в этом отношении. Есть ли какой-то другой атрибут, который мне может не хватать, или это единственный вариант использования пользовательского десериализатора?

В качестве еще одного примечания, я также пытался сделать что-то подобное, и я просто возвращаю ноль....

public class OrganizationType
{
    public string typeId { get; set; }
    public string type { get; set; }
}

public class OrgTypeCollection
{
    [DeserializeAs(Name = "row")]
    public List<OrganizationType> Names { get; set; }
}

person Dan    schedule 17.05.2015    source источник
comment
У вас есть два унаследованных объекта от одного и того же родителя. ряд и врач являются двумя дочерними классами. См. ответ 3 в следующей публикации: stackoverflow.com/questions/ 1708924/   -  person jdweng    schedule 17.05.2015


Ответы (1)


Благодаря этому сообщению https://stackoverflow.com/a/27643726 я смог "форкнуть" Deserialzier RestSharp и создать немного пользовательский вариант с двухстрочной модификацией, предоставленной The Muffin Man следующим образом

Добавлено это в HandleListDerivative в RestSharp.Deserializers.XmlDeserializer в строке 344.

var attribute = t.GetAttribute<DeserializeAsAttribute>();
if (attribute != null) name = attribute.Name;

Это позволило мне по желанию добавить DeserializeAs следующим образом:

[DeserializeAs(Name = "row")]
public class OrganizationType
{
    public string typeId { get; set; }
    public string type { get; set; }
}

Я не уверен, почему restsharp игнорирует это, кажется, что это было бы полезно в ряде случаев... В качестве примечания, функциональность создания вложенных списков также по-прежнему доступна. Хотя я не запускал тесты после модификации, похоже, он делает именно то, что вы ожидаете. Помимо этого все, что вам нужно сделать, это добавить пользовательский обработчик в состояние покоя, вызвав Client.AddHandler("application/xml", new CustomXmlDeserializer());

person Dan    schedule 18.05.2015