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

Posted

技术标签:

【中文标题】JsonConvert.DeserializeObject 特殊字符 未终止的字符串。预期的分隔符:【英文标题】:JsonConvert.DeserializeObject special characters Unterminated string. Expected delimiter: 【发布时间】:2014-03-01 04:26:08 【问题描述】:

由于某种原因,当我的淘汰模型中有一个特殊字符并将其转换为 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.

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

你能举个例子吗? 我找到了我自己问题的答案:escape(ko.toJSON(theModel)) 我所需要的只是转义函数,而且效果很好。【参考方案2】:

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

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

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

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

此函数对特殊字符进行编码。此外,它还对以下字符进行编码: , / ? : @ & = + $ #

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

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

【讨论】:

我有同样的问题,我发现问题是因为特殊字符@。 encodeURIComponent() 函数成功了。【参考方案3】:

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

【讨论】:

??,C# 不知道什么是“转义” 这是一个已被弃用的 javascript 函数 (v1.5),请参阅我对当前答案的回答。这个的 c# 版本是 Uri.UnescapeDataString()【参考方案4】:

我遇到了这个问题,我通过使用 JavaScript encodeURIComponent() 函数对 JSON 数据进行编码来解决它。

encodeURIComponent(data);

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起更多的关注这个问题。

以上是关于JsonConvert.DeserializeObject 特殊字符 未终止的字符串。预期的分隔符:的主要内容,如果未能解决你的问题,请参考以下文章