值不能为空。反序列化对象Json

时间:2013-10-31 20:49:01

标签: c# json asp.net-mvc-3

我遇到了将此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
            }
        };

2 个答案:

答案 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');

});

enter image description here

答案 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定义为单个对象 - 而不是包含单个对象的数组。解决这个问题,你的问题就会消失。