反序列化未填充我的变量/响应。数据显示为空

时间:2018-12-11 17:27:00

标签: c# restsharp

我想将从Rest API获得的jsonBody放入此类构造。

Console.WriteLine(response.Data);

以某种方式只返回null。

这是我的整个代码:

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);
}

该请求正在运行,我得到了Rest API的以下返回:

{
    "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 :(得分:0)

您的AuthenticationResponse可能需要

db.fn/cas

更新 根据您的评论,这是行不通的,请尝试使用Newtonsoft.Json反序列化您的结果。

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.
    }

您必须在类定义中使用JsonPropertyAttribute而不是DeserliazeAs。

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

其他选项

您还可以使用RestSharp.Newtonsoft.Json,它使Newtonsoft.Json成为RestSharp的默认序列化程序(并跳过中间步骤)。

答案 1 :(得分:0)

在您的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; }
    }

答案 2 :(得分:0)

我查看了您的代码,并使用 WebUntis 进行了尝试。这是一个作为控制台应用程序的工作示例。尤其重要的是对 client.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);
        }
    }
}

问候, 雷纳。