Десериализация не заполняет мои переменные / response.data показывает ноль - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу поместить jsonBody, полученную из Rest API, в конструкцию этого класса.

Console.WriteLine(response.Data);

Каким-то образом он возвращает только ноль.

Весь мой код:

RestClient client = new RestClient("https://euterpe.webuntis.com/WebUntis/jsonrpc.do?school=HTL-Perg");

public void login()
{
    var request = new RestRequest(Method.POST);
    request.AddHeader("Content-type", "application/jason");

    request.AddJsonBody(new
            {
                id = "ID",
                method = "authenticate",
                @params = new 
                {
                    user = "kung",
                    password = "foo",
                    client = "CLIENT"
                },
                jsonrpc = "2.0"
            });

    var response = this.client.Execute<AuthenticationResponse>(request);
    Console.WriteLine(response.Data);
}

Запрос работает, и я получаю следующий возврат API Rest:

{
    "jsonrpc":"2.0",
    "id":"ID",
    "result": {
                 "sessionId":"A173BECFB75F66123D6B678BE9745A29",
                 "personType":5, 
                 "personId":1234,
                 "klasseId":123
              }
}

Наконец, это два класса, в которых должен храниться ответ, но переменные, похоже, остаются пустыми:

    public class AuthenticationResponse
    {
        [DeserializeAs(Name = "jsonrpc")]
        public String Jsonrpc { get; set; }
        [DeserializeAs(Name = "id")]
        public int id { get; set; }
        [DeserializeAs(Name = "result", Content=true)]
        AuthenticationResult res { get; set; }
    }

    public class AuthenticationResult
    {
        [DeserializeAs(Name = "sessionId")]
        string sessionId { get; set; }
        [DeserializeAs(Name = "personType")]
        int personType { get; set; }
        [DeserializeAs(Name = "personId")]
        int personId { get; set; }
        [DeserializeAs(Name = "klasseId")]
        int klasseId { get; set; }
    }

Спасибо за каждый совет.

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

В вашем Json нет ничего, что называется "res", которое возвращается.Это должно исправить вашу проблему:

public class AuthenticationResponse
    {
        [DeserializeAs(Name = "jsonrpc")]
        public String Jsonrpc {get;set;}
        [DeserializeAs(Name = "id")]
        public int Id { get; set; }
        [DeserializeAs(Name = "result")]
        AuthenticationResult Result { get; set; }
    }
0 голосов
/ 16 декабря 2018

Я посмотрел на ваш код и попробовал его с WebUntis .Вот рабочий пример как консольное приложение.Особенно важным является вызов клиента. AddHandler Надеюсь, это поможет решить вашу проблему.

using RestSharp;
using RestSharp.Deserializers;
using System;
using System.Text;

namespace ConsoleApp3
{
    internal class Program
    {
        private static RestClient client = new RestClient("https://euterpe.webuntis.com/WebUntis/jsonrpc.do?school=HTL-Perg");

        public class AuthenticationResponse
        {
            [DeserializeAs(Name = "id")]
            public string id { get; set; }
            [DeserializeAs(Name = "result", Content = true)]
            public AuthenticationResult result { get; set; }
        }

        public class AuthenticationResult
        {
            [DeserializeAs(Name = "sessionId")]
            public string sessionId { get; set; }
            [DeserializeAs(Name = "personType")]
            public int personType { get; set; }
            [DeserializeAs(Name = "personId")]
            public int personId { get; set; }
            [DeserializeAs(Name = "klasseId")]
            public int klasseId { get; set; }
        }

        private static void Main(string[] args)
        {
            client.AddHandler(new JsonDeserializer(), "application/json-rpc");

            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-type", "application/json");

            request.AddJsonBody(new
            {
                id = "ID",
                method = "authenticate",
                @params = new
                {
                    user = "kung",
                    password = "foo",
                    client = "CLIENT"
                },
                jsonrpc = "2.0"
            });

            var response = client.Execute<AuthenticationResponse>(request);
            var resp = Encoding.UTF8.GetString(response.RawBytes, 0, (int)response.ContentLength);
            Console.WriteLine(response.Data);
        }
    }
}

Привет, Райнер.

0 голосов
/ 11 декабря 2018

Ваш AuthenticationResponse, возможно, должен быть

public class AuthenticationResponse
    {
        [DeserializeAs(Name = "id")]
        public string id { get; set; }
        [DeserializeAs(Name = "result")]
        AuthenticationResult res { get; set; }

        public string jsonrpc { get; set; } // Can remove if you dont need it.
    }

Обновление На основании вашего комментария, что это не сработало, попробуйте использовать Newtonsoft.Json для десериализации вашего результата.

var response = client.Execute(request);
var deserialized = JsonConvert.DeserializeObject<AuthenticationResponse>(response.Content);

Вы должны будете использовать JsonPropertyAttribute вместо DeserliazeAs в своем определении класса.

public class AuthenticationResponse
{
        [JsonProperty("id")]
        public string id { get; set; }
        [JsonProperty("result")]
        AuthenticationResult res { get; set; }
}

public class AuthenticationResult
{
        [JsonProperty("sessionId")]
        string sessionId { get; set; }
        [JsonProperty("personType")]
        int personType { get; set; }
        [JsonProperty("personId")]
        int personId { get; set; }
        [JsonProperty("klasseId")]
        int klasseId { get; set; }
}

Дополнительная опция

Вы также можете использовать RestSharp.Newtonsoft.Json , что делает сериализатор по умолчанию для Newtonsoft.Json для RestSharp (и пропуская промежуточный шаг).

...