2016-02-29 48 views
0

我無法將json字符串反序列化爲對象。我有一個類似的實例可以很好地處理不同的類,但是我似乎無法使這個工作正常。這裏是這個類:Json DeserializeObject異常:「引用未設置爲對象的實例」

class Task 
{ 
    public string ProviderID { get; set; } 
    public string Id { get; set; } 
    public string UserEmail { get; set; } 
    public string Name { get; set; } 
    public string Status { get; set; } 
    public string CompleteBy { get; set; } 
    public string CompleteAtLat { get; set; } 
    public string CompleteAtLon { get; set; } 
    public string PerformWithin { get; set; } 
    public string AdditionalInfo { get; set; } 
    public string UserCanReject { get; set; } 
    public string StartTime { get; set; } 
    public string CompleteTime { get; set; } 
    public string ActualCompleteLat { get; set; } 
    public string ActualCompleteLon { get; set; } 
    public string UserNotes { get; set; } 



    public static IList<Task> Get() 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create("url"); 
     req.Method = "GET"; 
     req.ContentType = "application/json"; 
     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
     using (StreamReader sr = new StreamReader(res.GetResponseStream())) 
     { 
      string text = sr.ReadToEnd(); 
      JObject jsonresponse = JObject.Parse(text); 
      Console.WriteLine(jsonresponse.ToString()); 
      IList<JToken> results = jsonresponse["Stasks"].Children().ToList(); 
      IList<Task> tasks = new List<Task>(); 
      foreach (JToken result in results) 
      { 
       Task task = JsonConvert.DeserializeObject<Task>(result.ToString()); 
       tasks.Add(task); 
      } 
      return tasks; 

     } 
    } 

這裏是我試圖反序列化的Json字符串的示例。

{ 
    "STasks":[ 
     { 
     "ProviderId":"xxxxx", 
     "Id":"xxxxx", 
     "UserEmail":"xxxxx", 
     "Name":"test", 
     "Status":"Completed", 
     "CompleteBy":"2014-11-15T15:17:00.0000000Z", 
     "CompleteAtLat":0, 
     "CompleteAtLon":0, 
     "PerformWithin":50, 
     "AdditionalInfo":"trsgghghfhghh", 
     "UserCanReject":true, 
     "STaskActivities":[ 
      { 
       "Instruction":"fsdgggdg", 
       "OutcomeId":"00000000000000000000000000000000", 
       "CompleteTime":"2014-11-14T15:19:37.0000000Z", 
       "ActivityType":"Instruction" 
      } 
     ], 
     "STaskHistories":[ 
      { 
       "EventDate":"2014-11-14T15:18:27.2975697Z", 
       "Status":"Draft" 
      }, 
      { 
       "EventDate":"2014-11-14T15:18:54.8263294Z", 
       "Status":"Sent" 
      }, 
      { 
       "EventDate":"2014-11-14T15:19:37.7176027Z", 
       "Status":"Accepted" 
      }, 
      { 
       "EventDate":"2014-11-14T15:19:49.0975573Z", 
       "Status":"Completed" 
      } 
     ], 
     "StartTime":"2014-11-14T15:19:37.0000000Z", 
     "CompleteTime":"2014-11-14T15:19:47.0000000Z", 
     "ActualCompleteLat":52.6091012845814, 
     "ActualCompleteLon":4.75544677437253, 
     "UserNotes":"Fyujvhfdkskbvdskbdvsbkdsvhkj" 
     } 
    ] 
} 

我找不到任何這種方法如何工作的詳細解釋,所以也許我在這裏失去了一些東西。如果我的班級沒有財產,但它確實出現在Json中,那麼它應該被忽略,對吧?

+0

你的json對象有STASK,你在代碼中指定了Stasks(jsonresponse [「Stasks」])。這可能是一個問題。 – lintmouse

+0

此外,不是手動迭代數據,而是使用Json.net – Gusman

+0

反序列化所有數據,拋出異常的行號將非常有幫助。其他然後大小寫不匹配@dustmouse發現,我沒有看到任何有關 –

回答

0

我認爲你只是解析了錯誤的JSON樹(雙關語!)。

當我將JSON映射到類中時,反序列化按預期工作。嘗試:

頂層JSON映射:

public class STasksContainer 
{ 
    public STask[] STasks{get;set;} 
} 

另外添加該映射主陣列元件:

public class STask 
{ 
    public string ProviderId {get;set;} 
    public string Id{get;set;} 
    public string UserEmail{get;set;} 
    public string Name{get;set;} 
    public string Status{get;set;} 
    public string CompleteBy{get;set;} 
    public double CompleteAtLat{get;set;} 
    public double CompleteAtLon{get;set;} 
    public int PerformWithin{get;set;} 
    public string AdditionalInfo{get;set;} 
    public bool UserCanReject{get;set;} 
    public string StartTime{get;set;} 
    public string CompleteTime{get;set;} 
    public double ActualCompleteAtLat{get;set;} 
    public double ActualCompleteAtLon{get;set;} 
    public string UserNotes{get;set;} 
    public STaskActivity[] STaskActivities{get;set;} 
    public STaskHistory[] STaskHistories{get;set;} 
} 

最後,在映射了兩個嵌套的數組元素添加內STask

public class STaskActivity 
{ 
    public string Instruction{get;set;} 
    public string OutcomeId{get;set;} 
    public string CompleteTime{get;set;} 
    public string ActivityType{get;set;} 
} 

public class STaskHistory 
{ 
    public string EventDate{get;set;} 
    public string Status{get;set;} 
} 

您可以測試代碼:

using (StreamReader sr = new StreamReader(res.GetResponseStream())) 
{ 
    string text = sr.ReadToEnd(); 
    var sTaskRoot = JsonConvert.DeserializeObject<STasksContainer>(text); 
} 

HTH ...!

+0

這是非常有幫助的!但是,我不想使用這個json字符串的某些部分。即使我對他們沒有任何用處,我是否還要支持他們? –

+0

你可以選擇抓取一個子集並反序列化它,但是從實際經驗來看,如果json不是非常複雜(在這種情況下不是非常複雜),那麼我們發現將整個圖映射出來要好得多。你可以看到這個觀察結果是由反序列化的努力帶來了3行代碼,任何潛在的未來變化將是映射,而不是核心邏輯本身(你可以稍後「黑匣子」契機)。 – code4life

相關問題