问题描述
我正在使用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: [] }
。在“无数据”情况下将其作为数组,在“有数据”情况下将其作为对象是没有意义的。