Json DeserializeObject错误返回

时间:2012-03-14 04:39:01

标签: c# asp.net-mvc json

我有一个名为sendData的Javascript函数。

var sendData = function (data) {
        alert("The following data are sending to the server");
        var dataToSend = JSON.stringify(data);
        alert(dataToSend);
        $.ajax({
            type: "POST",
            url: "Submit",
            dataType: "json",
            data: dataToSend,
            contentType: "application/json; charset=utf-8",
            success: function (response, textStatus, jqXHR) {
                alert("success");
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert("fail");
            }
        });
    };

通过使用这个js函数,我可以看到dataToSend

的值
[{"Seminar_Code":"CMP04","Speaker":"1","Tag":"1","DateAndTime":""},  {"Seminar_Code":"CMP04","Speaker":"2","Tag":"2","DateAndTime":""},{"Seminar_Code":"CMP04","Speaker":"3","Tag":"3","DateAndTime":""}]

然后我使用http://jsonlint.com/检查了它。这是有效的。

然后我在Controller Layer使用下面的代码。

    [AcceptVerbs(HttpVerbs.Post)]
    //[JsonFilter(Parameter = "seminar_detail", JsonDataType = typeof(Seminar_Detail))]
    public ActionResult Submit(JsonResult Jresult)
    {
        //var ttt = JsonConvert.DeserializeObject(Request["jsonString"], typeof(List<Seminar_Detail>));
        //var result = (new JsonSerializer()).Deserialize<List<Seminar_Detail>>(seminar_detail);
        //var result = JsonConvert.DeserializeObject<List<Seminar_Detail>>(seminar_detail.ToString());

        var result = JsonConvert.DeserializeObject<List<Seminar_Detail>>(Jresult.ToString());
        return View();
    }

然后,我收到了这个错误。

JsonReaderException was unhandled by user code
Unexpected character encountered while parsing value: S. Line 0, position 0.

使用Immediate window from vs 2010 IDE --- > Jresult.Data ,我得到null。

立即窗口的结果

Jresult.ToString()
"System.Web.Mvc.JsonResult"
Jresult.Data.ToString()
'Jresult.Data' is null
Jresult.Data
null

我正在使用Newtonsoft.Json and Asp.net MVC 4。 请让我知道如何解决此错误。

2 个答案:

答案 0 :(得分:3)

创建视图模型:

public class Seminar
{
    public string Seminar_Code { get; set; }
    public string Speaker { get; set; }
    public string Tag { get; set; }
    public string DateAndTime { get; set; }
}

然后让您的控制器操作将此视图模型的列表作为参数:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Submit(IEnumerable<Seminar> seminars)
{
    ... don't need to use any JSON serializers here. 

    return View();
}

这将在ASP.NET MVC 3中起作用。

如果您使用的是旧版本,则可以按following blog post中的说明创建自定义JsonValueProviderFactory,并且仍然可以将模型保留在您的操作中。

但是在任何情况下都不要在控制器中放置序列化基础设施代码。控制器不负责序列化/反序列化对象。

答案 1 :(得分:0)

使控制器参数类型为string,然后使用Newtonsoft.Json对其进行反序列化。

JSONResult属于ActionResult类型,不应用作操作参数。

你也是第一次尝试让Model Binder为你反序列化它,比如

在你的ajax调用试试,

data: { 'result': dataToSend } 

和你的控制器一样

public ActionResult Submit(IEnumerable<Seminar_Detail> result)
   {
     ....