1

我在将此 json 字符串反序列化为 ac# 对象时遇到问题。我尝试了许多不同的模型配置,我尝试序列化代码并让 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
  }
} 

解决方案将定义 的JS更改data为以下内容:

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

2 回答 2

3

您的问题是 - 在涉及 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为单个对象 - 而不是包含单个对象的数组。解决这个问题,您的问题应该会消失。

于 2013-10-31T21:12:21.430 回答
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');

});

在此处输入图像描述

于 2013-10-31T20:50:53.723 回答