2016-11-11 5 views
1

Я получаю Web API JSON ответ с помощью компонента SSIS сценария, который возвращается в следующем формате:Deserialize Json Web API Response - объекты Уплотненный

{ 
    "Success": true, 
    "Response": { 
    "Applications": [ 
     { 
     "App_ID": 1638486, 
     "App_Ref": "Test Example", 
     "Status": "Complete", 
     "Error_Code": null, 
     "Error_Message": null, 
     "Create_Dt": "2014-05-14 03:09:01.030 +00:00", 
     "Modify_Dt": "2014-05-14 03:10:59.757 +00:00", 
     "Client_Name": "Silver Chef", 
     "Client_Code": "SLVC01", 
     "Centrelink_Status": "Receiving_Logons" 
     }, 
     { 
     "App_ID": 1637906, 
     "App_Ref": "SME Demo", 
     "Status": "Complete", 
     "Error_Code": null, 
     "Error_Message": null, 
     "Create_Dt": "2015-10-08 03:07:26.793 +00:00", 
     "Modify_Dt": "2015-10-08 03:23:32.833 +00:00", 
     "Client_Name": "Silver Chef", 
     "Client_Code": "SLVC01", 
     "Centrelink_Status": "Receiving_Logons" 
     }, 
     { 
     "App_ID": 1585286, 
     "App_Ref": "Test", 
     "Status": "Receiving_Logons", 
     "Error_Code": null, 
     "Error_Message": null, 
     "Create_Dt": "2015-12-04 03:12:49.617 +00:00", 
     "Modify_Dt": "2015-12-04 03:12:49.617 +00:00", 
     "Client_Name": "Silver Chef", 
     "Client_Code": "SLVC01", 
     "Centrelink_Status": "Receiving_Logons" 
     } 
], 
    "Current_Dt": "2016-11-11 01:01:01.743 +00:00", 
    "Last_App_Dt": "2016-10-03 22:48:56.397 +00:00", 
    "Count": 500, 
    "Total": 1870 
    } 
} 

Я объявил следующие классы:

 public class Application 
     { 
      public int App_ID { get; set; } 
      public string App_Ref { get; set; } 
      public string Status { get; set; } 
      public int Error_Code { get; set; } 
      public string Error_Message { get; set; } 
      public DateTime Create_Dt { get; set; } 
      public DateTime Modify_Dt { get; set; } 
      public string Client_Name { get; set; } 
      public string Client_Code { get; set; } 
      public int Centrelink_Status { get; set; } 

     } 
     public class Response 
     { 
      public List<Application> Applications { get; set; } 
      public string Current_Dt { get; set; } 
      public string Last_App_Dt { get; set; } 
      public int Count { get; set; } 
      public int Total { get; set; } 
     } 

     public class RootObject 
     { 
      public bool Success { get; set; } 
      public Response Response { get; set; } 
     } 

And this is the method that I am using to get the response. 
private RootObject GetWebServiceResult(string vAPIUrl) 
    { 

     string vAPIToken = Variables.APIToken; 

     //Create Web Request 
     HttpWebRequest apireq = (HttpWebRequest)WebRequest.Create(vAPIUrl); 
     apireq.ContentType = "application/json"; 
     apireq.Method = "POST"; 

     string jsonPostStr = "{\"Settings\": {\"API_Token\": \"" + vAPIToken + "\"}, \"Payload\": {}}"; 
     byte[] postString = Encoding.UTF8.GetBytes(jsonPostStr); 

     apireq.ContentLength = postString.Length; 

     Stream jsonStream = apireq.GetRequestStream(); 

     jsonStream.Write(postString, 0, postString.Length); 
     jsonStream.Close(); 

     // Get Web Response   
     HttpWebResponse apirsp = (HttpWebResponse)apireq.GetResponse(); 
     RootObject jsonResponse = null; 

     Stream jsonRspStream = apirsp.GetResponseStream(); 
     string apiResponseString = null; 

     using (StreamReader reader = new StreamReader(jsonRspStream)) 
     { 
      apiResponseString = reader.ReadToEnd(); 
      Console.WriteLine(apiResponseString); 
      reader.Close(); 
     } 


     JavaScriptSerializer returnJson = new JavaScriptSerializer(); 

     //var serialJsonStr = returnJson.Serialize(apiResponseString); 
     System.Windows.Forms.MessageBox.Show(apiResponseString); 

     jsonResponse = returnJson.Deserialize<RootObject>(apiResponseString); 

     return jsonResponse; 

    } 

Моя проблема в том, что returnJson.Deserialize (apiResponseString);, кажется, возвращает null, а затем делает это неудачным.

Что мне не хватает? Я думаю, что на этом этапе я немного слепой код.

Заранее спасибо

+0

В качестве примечания: я бы рекомендовал использовать [Json.NET Library] (Http: //www.newtonsoft .com/json) – Jim

ответ

1

Есть несколько проблем с Application класса:

  • Вы определили Application.Error_Code быть целым числом:

    public int Error_Code { get; set; } 
    

    Но на самом деле, в JSON, оно имеет нулевое значение:

    "Error_Code": null, 
    

    Таким образом, Error_Code должен быть ссылочным типом (string) или нулевым типом значения (int?) в зависимости от того, что он удерживает при ненулевом.

  • Вы определили Centrelink_Status как int, но в формате JSON это строка:

    "Centrelink_Status": "Receiving_Logons" 
    

    Таким образом, она должна быть строка в модели данных, а также.

Таким образом, ваш Application класс должен выглядеть следующим образом:

public class Application 
{ 
    public int App_ID { get; set; } 
    public string App_Ref { get; set; } 
    public string Status { get; set; } 
    public int? Error_Code { get; set; } // Or string, if not numeric 
    public string Error_Message { get; set; } 
    public DateTime Create_Dt { get; set; } 
    public DateTime Modify_Dt { get; set; } 
    public string Client_Name { get; set; } 
    public string Client_Code { get; set; } 
    public string Centrelink_Status { get; set; } 
} 

Вы также можете сделать эти DateTime свойства быть обнуляемым, если есть шанс для значения null в формате JSON.

Кстати, когда я попытался десериализация этого JSON, я получил исключение брошено, а не нулевое значение, возвращаемое:

System.InvalidOperationException was unhandled 
    Message="Cannot convert null to a value type." 
    Source="System.Web.Extensions" 
    StackTrace: 

В реальном коде, вы ловить и глотать исключение? Это плохая идея именно потому, что она, как правило, скрывает такие ошибки. Как минимум, при отладке вы должны ломаться всякий раз, когда возникает какое-либо исключение, включая исключение из первого шанса - хотя это не поведение по умолчанию. См. Managing Exceptions with the Debugger. Если вы обнаружите, что есть определенные типы исключений, которые часто выбрасываются и не имеют отношения к отладке, вы можете выборочно их игнорировать. Если бы вы сделали так, эта ошибка была бы более простой для отслеживания. По общему признанию, ошибка не очень объяснима, но она дает подсказку.Если вы должны были использовать десериализовать ваш JSON, сообщение об ошибке будет гораздо понятнее:

Newtonsoft.Json.JsonSerializationException occurred 
    Message="Error converting value {null} to type 'System.Int32'. Path 'Response.Applications[0].Error_Code', line 9, position 26." 
    Source="Newtonsoft.Json" 
    StackTrace: 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 986 
    InnerException: System.InvalidCastException 
     Message="Null object cannot be converted to a value type." 
     Source="mscorlib" 
     StackTrace: 
      at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) 
      at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 979 
     InnerException: 
+0

Ты легенда! Спасибо! –