JsonConvert.DeserializeObject特殊字符未终止字符串。预期分隔符:

时间:2014-02-04 23:03:10

标签: c# jquery asp.net-mvc json knockout.js

出于某种原因,当我在我的淘汰模型中有一个特殊字符并将其转换为json对象时,字符串将结束特殊字符所在的位置,并且在反序列化时出现错误:

$.ajax({
    url: "/Admin/Forms/Convert",
    type: "post",
        //contentType: "application/json",
        dataType: "text",
        data: "modelData=" + ko.toJSON(theModel),
        success: function (data) {

            // window.open("/Admin/Forms/DisplayClient");
            var win = getFullWindow('/Admin/Forms/DisplayClient');
            win.open();
        },
        error: function (xhr, status, msg) { alert(msg); }
    });

当我使用这种方法时:

public void Convert(string modelData)
{
    Form form = JsonConvert.DeserializeObject<Form>(modelData);
}

我收到错误:

Unterminated string. Expected delimiter: ". Path 'Name', line 1, position 178.

3 个答案:

答案 0 :(得分:1)

如果JSON字符串包含双引号",反斜杠\或斜杠/等特殊字符,则需要使用反斜杠\进行转义。没有JSON解析器能够处理首先没有正确格式化的JSON字符串。

因此,您需要确保theModel的格式正确且符合JSON.org标准。

答案 1 :(得分:1)

我有几次同样的错误。我更新了我的web.config更大的最大长度,以确保没有截断。

<httpRuntime maxQueryStringLength="2097151" maxUrlLength="2097151" />

<security>
  <requestFiltering>
    <requestLimits maxQueryString="2097151" maxUrl="2097151" />
  </requestFiltering>
</security>

encodeURIComponent()函数对URI组件进行编码。

此功能可对特殊字符进行编码。另外,它编码以下字符:,/? :@&amp; = + $#

这已添加到我的ajax请求中:

$.ajax("URL", {
    type: "POST",
    cache: false,
    data: { a: encodeURIComponent(jsonData), b: userID }
})

答案 2 :(得分:0)

我找到了自己问题的答案:escape(ko.toJSON(theModel))我需要的只是转义函数,它运行得很好。