2013-10-31 65 views
0

我有問題反序列化這個JSON字符串到C#對象。我已經嘗試了許多不同的模型配置,我試圖序列化代碼,並讓mvc值提供程序來做到這一點,但我無法得到它的工作.....所以我發送這個JSON字符串給我控制器,然後將其放入一個對象,然後創建正確的對象將其放入我的數據庫中。值不能爲空。反序列化對象Json

[ArgumentNullException: Value cannot be null. 
Parameter name: value] 
    Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) +162 
    Newtonsoft.Json.JsonConvert.DeserializeObject(String value, JsonSerializerSettings settings) +66 
    InSight.Controllers.QuestionController.CreateSimpleQuestion(String json) +25 

這是字符串之前,我把它發送到我的控制器:

var data = JSON.stringify({ 
      QuestionTitle: title, 
      Keywords: key, 
      Description: desc, 
      Comments: comments, 
      QuestionType: type, 
      choices: { 
       DisplayText: text, 
       OrderNumber: order, 
       is_correct:is_correct 
      } 
     }); 

這是控制器的方法:

public ActionResult CreateSimpleQuestion(string json) 
    { 
     SimpleQuestion temp = JsonConvert.DeserializeObject<SimpleQuestion>(json); 
     Question question = new Question(); 
     question.QuestionTitle = temp.QuestionTitle; 
     question.QuestionType = temp.QuestionType; 
     question.Keywords = temp.Keywords; 
     question.is_counted = true; 
     question.DateCreated = DateTime.Now; 
     question.Comments = temp.Comments; 
     question.QuestionType = "Simple"; 
     db.Questions.Add(question); 

     db.QuestionChoices.Add(temp.choices.First()); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

,這是模型:

public class SimpleQuestion 
    { 
      public int QuestionId { get; set; } 

      public string QuestionTitle { get; set; } 

      public DateTime DateCreated { get; set; } 

      public string QuestionType { get; set; } 

      public string Keywords { get; set; } 

      public bool is_counted { get; set; } 

      public string Description { get; set; } 

      public string Comments { get; set; } 

     public List<QuestionChoices> choices { get; set; } 
    } 

最後,這是實際的字符串

{"QuestionTitle":"This is the Question Title", 
"Keywords":"Blue pony, sharks", 
"Description":"This is the description field.", 
"Comments":"No comment has been left.", 
"choices":{ 
    "DisplayText":"Will it rain tomorrow?", 
    "OrderNumber":"1","is_correct":false 
    } 
} 

解決方案 變化,其中data被定義爲以下的JS:

  var data = { 
      "QuestionTitle": title, 
      "Keywords": key, 
      "Description": desc, 
      "Comments": comments, 
      "QuestionType": type, 
      "choices": { 
       "DisplayText": text, 
       "OrderNumber": order, 
       "is_correct":false 
      } 
     }; 
+1

在這個JSON'選擇'是一個**單個對象**,而在你的C#對象中它是**對象列表**。在JSON中的對象列表將是:''選擇「:[{obj1},{obj2}]' – user2674389

+0

如何修復stringify函數以顯示?我認爲這是模型活頁夾不能正常工作的實際問題。 – schumacherj

+1

請參閱我的回答。你的JavaScript已經是錯誤的,其中的選擇也是單個對象(而不是陣列) – user2674389

回答

3

有關問題的真正解決方案是使用MVC模型綁定功能,這是獲得傳遞的數據。將您的方法參數類型更改爲您的類,並且MVC會將JSON值綁定到它。

public ActionResult Create(SimpleQuestion model) 
{ 
    // use model now 
    // TO DO :Save and redirect 
} 

確保您指定contentType屬性值作爲你的Ajax調用 「應用/ JSON」。

如果它是一個有效的JSOn,你也不需要調用stringify。下面的代碼將正常工作

$(function() { 
    var data = { 
     "QuestionTitle": "This is the Question Title", 
     "Keywords": "Blue pony, sharks", 
     "Description": "This is the description field.", 
     "Comments": "No comment has been left.", 
     "choices": { 
      "DisplayText": "Will it rain tomorrow?", 
      "OrderNumber": "1", 
      "is_correct": false 
     } 
    };  
    $.post("@Url.Action("Create","Home")", data, null, 'application/json'); 

}); 

enter image description here

+0

我在模型綁定方面有很多問題。但我會再試一次。代碼看起來會更清晰。 – schumacherj

+0

初始化選項時出錯:''... choices'是'屬性',但正在像'type'一樣使用。 – schumacherj

+0

是你的屬性名稱> – Shyju

2

你的問題是 - 正如經常說到JSON - 的JSON和數據結構之間的不匹配。

在你的數據結構中有這樣的:QuestionChoices的列表。

public List<QuestionChoices> choices { get; set; } 

在你的JSON發送這樣的:一個對象。

 choices: { 
      DisplayText: text, 
      OrderNumber: order, 
      is_correct:is_correct 
     } 

請記住,在JSON的陣列(或列表)與[]說明。所以正確的JSON會是這樣的:

 choices: [{ 
      DisplayText: text, 
      OrderNumber: order, 
      is_correct:is_correct 
     }] 

多個選擇將在[]中用逗號分隔。

該問題源於您的JavaScript代碼,您將choices定義爲單個對象 - 而不是包含單個對象的數組。解決這個問題,你的問題應該消失。