2

У меня возникла проблема с использованием функции «Вставить XML как классы» в VS2012, чтобы должным образом десериализовать XML-результаты из вызова Rest с помощью Web API.Использование «Вставить XML как классы» для десериализации ответа на вызов Web API

Ответ XML от вызова выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<SCResponse> 
    <AccountId>86</AccountId> 
    <Administrator>false</Administrator> 
    <Email>[email protected]</Email> 
    <FirstName>[email protected]</FirstName> 
    <Label>false</Label> 
    <LastName>[email protected]</LastName> 
    <link href="https://cnn.com" rel="news" title="News"/> 
</SCResponse> 

Я скопировал этот XML и использовал удобную новую функцию, чтобы вставить этот XML в качестве классов:

namespace Models.account.response 
{ 
    [XmlRoot(ElementName = "SCResponse")] // I added this so I could name the object Account 
    [DataContract(Name = "SCResponse", Namespace = "")] // I added this as the namespace was causing me problems 
    public partial class Account 
    { 
     public byte AccountId { get; set; } 

     public bool Administrator { get; set; } 

     public string Email { get; set; } 

     public string FirstName { get; set; } 

     public bool Label { get; set; } 

     public string LastName { get; set; } 

     [XmlElement("link")] 
     public SCResponseLink[] Link { get; set; } 
    } 

    [XmlType(AnonymousType = true)] 
    public partial class SCResponseLink 
    { 
     private string hrefField; 

     private string relField; 

     private string titleField; 

     [XmlAttribute)] 
     public string href { get; set; } 

     XmlAttribute] 
     public string rel { get; set; } 

     [XmlAttribute] 
     public string title { get; set; } 
     } 
    } 
} 

я называю конечную точку REST например:

string path = String.Format("account/{0}", id); 
HttpResponseMessage response = client.GetAsync(path).Result; // Blocking call! 
if (response.IsSuccessStatusCode) 
{ 
    // Parse the response body. Blocking! 
    account = response.Content.ReadAsAsync<Models.account.response.Account>().Result; 
} 

и изучить поля объекта «Учетная запись» - все имеют значение null или defaultin g до инициализированных значений.

В моем методе Global.asax.cs Application_Start, я регистрируя XML Serializer:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 
+0

Вам нужны атрибуты [DataMember], добавленные к каждому свойству при использовании [DataContract] ... –

ответ

0

Более простой способ справиться с этим может быть использовать RestSharp library, который будет делать все десериализации для вас , Это упростит ваши вызовы, и вам не понадобятся атрибуты XML в вашей модели.

Посмотри здесь хороший пример делать aync звонков с RestSharp:

How should I implement ExecuteAsync with RestSharp on Windows Phone 7?

Надеется, что это помогает.

+0

Эта опция работала очень хорошо для меня, спасибо – user486480

Смежные вопросы