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

How To Handle Two JSON Responses in C#

我正在用 C# 为 Xamarin Forms 编码,并使用 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"}}

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

我尝试将这两个响应反序列化为一个 class,但如果用户已成功验证,它似乎不会填充变量,这很奇怪。

这是我的代码:

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

还有我的 classes:

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 是一个非空的 对象 .

您的 class 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 响应 1 更改为 { <omitted code>, data: null } 而不是 { <omitted code>, data: [] }。它在“无数据”情况下是一个数组,在“有数据”情况下是一个对象没有多大意义。

假设您验证用户凭据的其余调用将在用户未被授权时发送 403。我认为您没有正确设置 class 对象以进行反序列化。 在下面尝试在 Root class

中设置 Data class

首先你需要class反序列化数据,但看起来不正确,

   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 Data data { get; set; }
    }

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

同样检查这样的响应是无效的,

if (JWTResults.success.ToString() == "True")   

相反,您应该始终检查 API (200/403/401) 的响应代码 你应该把它放进去,

    var response_status = await client.PostAsync(uri, content)
    if (response_status.StatusCode != HttpStatusCode.OK)
    {
       //Return error ??
    }