2014-11-20 1 views
1

Следующий необработанный вывод (полученный из свойства RestResponse.Content) не десериализуется. Это потому, что в качестве префикса добавляется «ns1»? Есть ли что-то, что я делаю неправильно?RestSharp Deserialization не работает

Вот содержание сырого JSON возвращается при выполнении вызова:

{ "ns1.model-ответ-лист": { "@ дроссельный": "2", "@ Тотал-модели": "3372", "ns1.model-re sponses": {"ns1.model": [{"@ mh": "0x20e800", "ns1.attribute": {"@ id": "0x1006e", "$ Msgstr "" ":" 0 0 0 0 0 0 0 0 0 }]}, "ns1.link": {"@ rel": "next", "@ href": " http: // ipaddress/spectrum/restful/devices? id = 93fc1a07-60be-4dd5-964c-7 e8660dd3028 & start = 2 & throttlesize = 2 "," @ type ":" application/xml "}}}

class Program 
{ 
static void Main(string[] args) 
{ 
var client = new RestClient(Spectrum.Endpoints.Development); 
client.Authenticator = new HttpBasicAuthenticator("myid", "mypassword"); 

var request = new RestRequest(Method.GET); 
request.RequestFormat = DataFormat.Xml; 
request.Resource = "devices?{attr}&{throttlesize}"; 
request.AddParameter("attr", Spectrum.Attributes.ModelName); 
request.AddParameter("throttlesize", "2"); 

IRestResponse<ModelResponseList> response = client.Execute<ModelResponseList>(request); 

Console.Write(response.Data.Throttle); // This line keeps returning 0, but should return 2 
} 

Вот классы, которые должны содержать данные:

[DeserializeAs(Name = "model-response-list")] 
public class ModelResponseList 
{ 
    [DeserializeAs(Name = "throttle")] 
    public int Throttle { get; set; } 

    [DeserializeAs(Name = "total-models")] 
    public int TotalModels { get; set; } 

    [DeserializeAs(Name = "model-responses")] 
    public List<Model> ModelResponses { get; set; } 

    [DeserializeAs(Name = "link")] 
    public Link Link { get; set; } 
} 

public class Model 
{ 
    public string Mh { get; set; } 
    public ModelAttribute Attribute { get; set; } 
} 

public class ModelAttribute 
{ 
    public string Id { get; set; } 
    public string Value { get; set; } 
} 

public class Link 
{ 
    public string Rel { get; set; } 
    // Note! Href must be escaped, e.g. "&" => "&amp;" or comment this prop out 
    public string Href { get; set; } 
    public string Type { get; set; } 
} 
+0

Подождите, что? Сначала вы задаете вопрос, затем, после ответа на него, вы удаляете вопрос и копируете/вставляете мой ответ (определения классов выше) в новый вопрос? FTW, правда ?! –

ответ

1

Я действительно не знаю, почему я предлагаю вам с этим ответом. Но все же, я. Вы должны пойти и получить Json.NET через NuGet и позволить ему помочь вам. Это сложнее, чем встроенная дезадаптация/сериализация RestSharp.

Как только у вас есть Json.NET, ваш JSON может быть сериализован, используя классы ниже. На этот раз я надеюсь, что вы НЕ удаляете вопрос после того, как получите ответ, но согласитесь, и, возможно, вместо этого выберете его?

Таким образом, используя

var response = client.Execute(request); 
var deserialized = JsonConvert.DeserializeObject<Wrapper>(response.Content); 
Console.WriteLine(JsonConvert.SerializeObject(deserialized)); 

выходы на консоли следующую

{ "ns1.model-ответ-лист": { "@ дроссель": 2, "@ Тотал-модели" : 3372, "ns1.model-ответы": { "ns1.model": [{ "@ тк": "0x20e800", "ns1.attribute": { "@ ID": "0x1006e", "$":» Sservername.com "}}, {" @ тк ":" 0x21a400" , "ns1.attribute": { "@ ID": "0x1006e", "$": "servername.com"}}]}, "ns1. link ": {" @ rel ":" next "," @ href ":" hxxp: // ipaddress/spectrum/restful/devices? id = 93fc1a07-60be-4dd5-964c-7 e8660dd3028 & начать = 2 & throttlesize = 2" , "@ типа": "приложение/XML"}}}

Если вы используете классы ниже

[JsonObject] 
public class Wrapper 
{ 
    [JsonProperty(PropertyName = "ns1.model-response-list")] 
    public ModelResponseList ModelResponseList { get; set; } 
} 

[JsonObject] 
public class ModelResponseList 
{ 
    [JsonProperty(PropertyName = "@throttle")] 
    public int Throttle { get; set; } 

    [JsonProperty(PropertyName = "@total-models")] 
    public int TotalModels { get; set; } 

    [JsonProperty(PropertyName = "ns1.model-responses")] 
    public Responses ModelResponses { get; set; } 

    [JsonProperty(PropertyName = "ns1.link")] 
    public Link Link { get; set; } 
} 

[JsonObject] 
public class Responses 
{ 
    [JsonProperty(PropertyName = "ns1.model")] 
    public List<Model> Model { get; set; } 
} 

[JsonObject] 
public class Model 
{ 
    [JsonProperty(PropertyName = "@mh")] 
    public object Mh { get; set; } 

    [JsonProperty(PropertyName = "ns1.attribute")] 
    public ModelAttribute Attribute { get; set; } 
} 

[JsonObject] 
public class ModelAttribute 
{ 
    [JsonProperty(PropertyName = "@id")] 
    public string Id { get; set; } 

    [JsonProperty(PropertyName = "$")] 
    public string Value { get; set; } 
} 

[JsonObject] 
public class Link 
{ 
    [JsonProperty(PropertyName = "@rel")] 
    public string Rel { get; set; } 

    [JsonProperty(PropertyName = "@href")] 
    public string Href { get; set; } 

    [JsonProperty(PropertyName = "@type")] 
    public string Type { get; set; } 
} 
+1

Еще раз спасибо! Извините за удаление старого вопроса, обновленное «новое» состояние кода было немного запутанным, и именно поэтому я сделал это. Реально, я должен поддержать это, а затем начал этот новый вопрос. – blgrnboy

+0

Если вы хотите использовать JSON.NET с помощью RestSharp, вы можете легко интегрировать его с https://www.nuget.org/packages/RestSharp.Newtonsoft.Json. – Adam