【问题标题】:Decoding Json data from API从 API 解码 Json 数据
【发布时间】:2013-11-08 09:52:23
【问题描述】:

我是 Json 新手,必须反序列化从 url 接收到的一些 Json 数据。 我正在使用为我提供的 API 将用户登录到应用程序。

API:

登录

要登录,请拨打以下电话

<site>/Users/login/username:<email>/password:<password>.json

• 成功响应

{
  “response”:{
       “sessionId” : “<sessionId>”,
       “businesses” : [{
          “<bizId-1>” : “<bizName-1>”,
          “<bizId-2>” : “<bizName-2>” ,
          “<bizId-n>” : “<bizName-n>”
       }]
  },
  “messages” :{"msgs":"","errs":""}
}

一个实际响应的例子如下。

{
  "response":{
     "sessionId":"50b702d8-78dc-4d65-9de8-2510c327a7be",
     "businesses":[
        {"50c657af0ad8-4ce7-bb08-1d60c327a7be":"All of The Lights"},
        {"50cf705a-ded4-4c7d-95df-51c8c327a7be":"Tomatoes Inc"},
        {"50d2cf88-e664-4103-99f9-1aa0c327a7be":"Joe's Jalepinos"},
        {"50d2d9b9-c358-4129-b9ec-1aa0c327a7be":"Pizza Place"},
        {"50eed93e-f49c-4dff-8c7a-33f0c327a7be":"Samsung"},
        {"51036f10-e9c0-47ecb73d-0f50c327a7be":"Peppers"},
        {"51036fcd-a6b8-4103-8e160f82c327a7be":"Puppy"}
    ]
   },
   "messages":{"msgs":"","errs":""}
}

我有以下代码:

try
{
   serverUrl = "https://eko-app.com/Users/login/username:" + usernameEntered + "/password:" + passwordEntered + ".json";

   var w = new WebClient();
   var jsonData = string.Empty;

   // make the login api call
   jsonData = w.DownloadString(serverUrl);

   if (!string.IsNullOrEmpty(jsonData))
   {
      var dataResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonData);
      // need help here
   }
}
catch (Exception ex)
{
   MessageBox.Show(ex.Message);
}

我首先想从响应中检索会话 ID。如果存在,则允许用户登录,如果会话 id 为空,则拒绝登录。我该怎么做?

此外,一旦用户登录,我想创建一个列表,显示每个用户的企业数量及其各自的企业 ID。

任何帮助表示赞赏。

【问题讨论】:

    标签: c# json api


    【解决方案1】:

    要以强类型方式执行此操作,请创建一个镜像您要反序列化的 Json 的类(只需要您感兴趣的属性)。

    class LoginResponseDetails
    {
        public string SessionId {get;set;} // this might be better as a GUID
    
        public Hashtable Businesses {get;set;} // this could be Dictionary<string, string> or Dictionary<Guid, string>
    
        // other properties here...
    }
    
    class LoginResponse
    {
        LoginResponseDetails Response {get;set;}
        // other properties here...
    }
    

    然后反序列化到这个类:

    var response = Newtonsoft.Json.JsonConvert.DeserializeObject<LoginResponse>(jsonData);
    var sessionId = response.Response.SessionId;
    

    等等……

    【讨论】:

    • 感谢您的回复 user2965995。我只是在如何分别读取业务数组/列表方面遇到问题。即获取每行的企业 ID 和企业名称。
    • 我已经编辑了我的答案,尝试使用 Hashtable、Dictionary 或 Dictionary
    【解决方案2】:

    你差不多了,只需要看看匿名类型的属性。

    试试类似的东西

    if (!string.IsNullOrEmpty(jsonData))
    {
      var dataResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonData);
    
      if (dataResult != null && dataResult.response.sessionId != null)
      {
         // logged in
         // iterate and show bussiness list
      } else {
         Console.WriteLine("Login failed");
      }
    }
    

    请参阅 JSON.NET 文档 - http://james.newtonking.com/json/help/html/DeserializeAnonymousType.htm

    【讨论】:

    • 感谢您的回复卡米。我只是在如何分别读取业务数组/列表方面遇到问题。即获取每行的企业 ID 和企业名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2019-04-26
    • 2011-10-19
    相关资源
    最近更新 更多