2012-01-29 5 views
0

В настоящее время я пишу библиотеку C#, чтобы использовать кросс-платформу для windows, iOS, Android. Я потребляю службу Rest и имею некоторые проблемы с возвращаемыми объектами из ответа. Я использую RestSharp для вызовов api. Я использовал Xsd2Code.NET для генерации моих классов из xsd, предоставленного api.RestSharp, потребляющий SubSonic REST Api

Проблема в том, что ответы обернуты в <subsonic-response>. Элемент, который я хочу, содержится внутри. RestSharp пытается разобрать и выполнить, если я передаю тип как List<NowPlaying>, но элементы внутри этого объекта не будут заполнены объектом NowPlaying. Я создал методы serialize/deserialize для NowPlaying, но из-за <subsonic-response> в качестве корневого элемента создается исключение. Есть ли способ удалить <subsonic-response>? Я попробовал response.RootElement = «дозвуковой-ответ» для вызова RestSharp, но не работает. См. Ответ ниже. Любая помощь будет большой.

RestResponse:

<?xml version="1.0" encoding="UTF-8"?> 
<subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.7.0"> 
<nowPlaying> 
    <entry  id="503a5c4d757369635c4a616e20326b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d3320284d454d4241204d45204d4141442920324b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d332020284d454d4241204d45204d4141442920324b31325c38372e2044616e63652044616e63652028445542535445502052454d495829202d20426967205365616e2e6d7033" parent="503a5c4d757369635c4a616e20326b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d3320284d454d4241204d45204d4141442920324b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d332020284d454d4241204d45204d4141442920324b3132" 
title="Dance Dance (DUBSTEP REMIX) - Big Sean" 
isDir="false" 
album="M3 MIXTAPE (MEMBA. ME. MAAD)" 
artist="DJ CHRISTUFF DI MAD YUTE FROM RENAISSANCE" 
duration="67" 
bitRate="192" 
year="2012" 
size="1615419" 
suffix="mp3" 
contentType="audio/mpeg" 
isVideo="false" 
coverArt="503a5c4d757369635c4a616e20326b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d3320284d454d4241204d45204d4141442920324b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d332020284d454d4241204d45204d4141442920324b31325c444a20434852495354554646202d204d454d4241204d45204d4141442046524f4e542e6a7067" 
path="Jan 2k12/DJ CHRISTUFF DI MAD YUTE FROM RENAISSANCE PRESENTS M3 (MEMBA ME MAAD) 2K12/DJ CHRISTUFF DI MAD YUTE FROM RENAISSANCE PRESENTS M3 (MEMBA ME MAAD) 2K12/87. Dance Dance (DUBSTEP REMIX) - Big Sean.mp3" 
username="admin" 
playerId="2" 
playerName="subAir" 
minutesAgo="0"/> 
</nowPlaying> 
</subsonic-response> 

Класс, который был сгенерирован:

public partial class NowPlaying : EntityBase<NowPlaying> 
{ 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    private List<NowPlayingEntry> entryField; 

    public List<NowPlayingEntry> entry 
    { 
     get 
     { 
      if ((this.entryField == null)) 
      { 
       this.entryField = new List<NowPlayingEntry>(); 
      } 
      return this.entryField; 
     } 
     set 
     { 
      if ((this.entryField != null)) 
      { 
       if ((entryField.Equals(value) != true)) 
       { 
        this.entryField = value; 
        this.OnPropertyChanged("entry"); 
       } 
      } 
      else 
      { 
       this.entryField = value; 
       this.OnPropertyChanged("entry"); 
      } 
     } 
    } 
} 

Мой метод Я звоню, чтобы получить NowPlaying от службы

public NowPlaying getNowPlaying() 
    { 
     NowPlaying playing; 
     try 
     { 
      var request = new RestRequest(); 
      request.Resource = "getNowPlaying.view"; 
      playing = SendRequest<NowPlaying>(request); 

     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 

     return playing; 

    } 

ответ

0

отдыха решить мою проблему. Конечным результатом было то, что RestSharp не десериализовал мой объект. Получите содержимое RestResponse, которое является ответом xml. Затем десериализуйте объект Response для api. Возглавил response.item и отбросил его к моему объекту NowPlaying, и все данные были в объекте.

string xml = SendRequest(request); 
var res = Response.Deserialize(xml); 
playing =(NowPlaying)res.Item; 
0

Общая структура для класса C#, который будет соответствовать этой схемы заключается в следующем:

public class SubsonicResource { 
    public List<entry> NowPlaying { get; set; } 
} 

public class entry { 
    public string Id { get; set; } 
    public string Path { get; set; } 
    public string Username { get; set; } 
    ... 
} 

Тогда вы можете позвонить Execute<SubsonicResource>() и она должна быть заполнена.