如何在 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 ??
}
我正在用 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 ??
}