如何在C#中处理两个JSON响应

问题描述

我正在使用C#编写Xamarin表单,并使用JWTAuth对wordpress上的用户名密码进行身份验证。

但是我收到两个似乎没有填充变量的JSON响应。

JSON响应1:

{"success":false,"statusCode":403,"code":"invalid_username","message":"UnkNown username. Check again or try your email address.","data":[]}

JSON响应2:

{"success":true,"statusCode":200,"code":"jwt_auth_valid_credential","message":"Credential is valid","data":{"token":"xxxxx","id":xxxx,"email":"xxxxx","nicename":"xxxx","firstName":"xxxx","lastName":"xxxx","displayName":"xxxx"}}

您会注意到,如果用户得到验证,第二个响应将在数据键值中填充额外的详细信息。

我尝试将这两个响应反序列化为一个类,但是如果成功验证了用户,这似乎并没有填充变量。

这是我的代码

Console.WriteLine("Running Authentication...");

string JWTAPI = "https://xxxx/wp-json/jwt-auth/v1/token";

var client = new HttpClient();
var uri = JWTAPI;

var jsonContent = "{ \"username\": \"" + EntryLoginUsername + "\",\"password\": \"" + EntryLoginPassword + "\"}";

StringContent content = new StringContent(jsonContent,Encoding.UTF8,"application/json");

var response_status = await client.PostAsync(uri,content);

var response_result = await response_status.Content.ReadAsstringAsync();

JWTJSONResponse = response_result;

Console.WriteLine(JWTJSONResponse);

Root JWTResults = JsonConvert.DeserializeObject<Root>(JWTJSONResponse);

Console.WriteLine("Result: " + JWTResults.success);

            if (JWTResults.success.ToString() == "True")    
            {
                ResultTextHeader.Text = "LOGIN SUCCESSFUL!";
                Console.WriteLine("Status Code: " + JWTResults.statusCode);
                Console.WriteLine("Code: " + JWTResults.code);
                Console.WriteLine("Message: " + JWTResults.message);
            }
            else
            {
                ResultTextHeader.Text = "Unsuccessful login. Please try again.";
            }

我的课程:

public class Data
        {
            public string token { get; set; }
            public int id { get; set; }
            public string email { get; set; }
            public string nicename { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string displayName { get; set; }
        }

        public class Root
        {
            // JWT
            public bool success { get; set; }
            public int statusCode { get; set; }
            public string code { get; set; }
            public string message { get; set; }
            public List<object> data { get; set; }

        }

解决方法

这是因为在JSON响应1中,data是一个空的数组。在JSON响应2中data是一个非空的对象

您的类Root具有属性data,类型为List<object>。这只能处理一个数组。要使其正常工作,请将Root.data更改为Data类型,如下所示:

public class Root
{
    // JWT
    public bool success { get; set; }
    public int statusCode { get; set; }
    public string code { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}

此外,如果您有权访问它,请将JSON Response 1更改为{ <omitted code>,data: null }而不是{ <omitted code>,data: [] }。在“无数据”情况下将其作为数组,在“有数据”情况下将其作为对象是没有意义的。