我遇到了将此json字符串反序列化为c#对象的问题。我尝试了很多不同的模型配置,我试图序列化代码,让mvc值提供者这样做,但我不能让它工作.....所以我发送这个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
}
};
答案 0 :(得分:3)
您的问题的真正解决方案是使用MVC的模型绑定功能。将您的方法参数类型更改为您的类,MVC将JSON值绑定到它。
public ActionResult Create(SimpleQuestion model)
{
// use model now
// TO DO :Save and redirect
}
确保在ajax调用中将contentType
属性值指定为“ application / 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');
});
答案 1 :(得分: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
定义为单个对象 - 而不是包含单个对象的数组。解决这个问题,你的问题就会消失。