【问题标题】:How To Handle Two JSON Responses in C#如何在 C# 中处理两个 JSON 响应
【发布时间】:2020-09-03 15:15:03
【问题描述】:

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

        }

【问题讨论】:

    标签: c# json xamarin.forms jwt jwt-auth


    【解决方案1】:

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

    你的类Root 有一个属性data,它的类型是List&lt;object&gt;。这只能处理一个数组。要使其正常工作,请将 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 更改为 { &lt;omitted code&gt;, data: null } 而不是 { &lt;omitted code&gt;, data: [] }。在“无数据”情况下作为数组和在“有数据”情况下作为对象没有多大意义。

    【讨论】:

      【解决方案2】:

      假设当用户未获得授权时,您验证用户凭据的 rest 调用将发送 403。我认为您没有正确设置类对象以进行反序列化。 尝试在下面我在Root 类中设置Data

      首先你需要类来反序列化数据并且看起来不正确,

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

      【讨论】:

      • 谢谢@Sohan,你说得对,需要更改的是公共数据数据部分。它现在正在工作。我还会用你的代码来验证返回的响应码,非常有用。
      • @Khoa 如果可行,您能否也将其标记为已接受的答案。这有助于识别某人是否工作:)
      猜你喜欢
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多