C# 解析长JSON字符串会引发“未捕获语法错误:意外字符串”
我有一个c.NETMVC应用程序。我正在使用jQueryUI自动完成。我已经创建了一个有效的JSON字符串发送到自动完成并将其添加到视图中,如下所示:C# 解析长JSON字符串会引发“未捕获语法错误:意外字符串”,c#,json,asp.net-mvc-3,C#,Json,Asp.net Mvc 3,我有一个c.NETMVC应用程序。我正在使用jQueryUI自动完成。我已经创建了一个有效的JSON字符串发送到自动完成并将其添加到视图中,如下所示: $(document).ready(function() { autoCompleteParams[@Model.Id] = jQuery.parseJSON(@Html.Raw(Json.Encode(Model.ParamValueListJson))); // Handles onchange for autocomplet
$(document).ready(function() {
autoCompleteParams[@Model.Id] = jQuery.parseJSON(@Html.Raw(Json.Encode(Model.ParamValueListJson)));
// Handles onchange for autocomplete
$reports.initParamList('@Model.Id');
});
当我检查ParamValueListJson的值并通过JSON验证运行它时,它是一个有效字符串。然而,它很长。粘贴到Word中时,包含98页424638个字符(包括空格)
当我查看返回到视图的html,特别是检查结果值时,我可以看到字符数下降到31424。因为它被截断了,JSON是无效的,我得到了错误Uncaught Syntax error:Unexpected String
如果我限制返回的记录,那么一切都会重新开始。然而,我不能那样做。我需要所有值作为选项
处理这个问题的最佳方法是什么?我是否可以确保将完整的JSON字符串返回到视图?是否有其他方法为自动完成创建对象?或者,我是否需要人为地限制JSON的长度,然后在视图中合并结果
在此方面的任何帮助都将不胜感激。到目前为止,谷歌搜索毫无帮助
使现代化
我只是看了近一点,现在看到完整的字符串正在传递给视图。AJAX调用中返回的数据具有完整的字符串。但是,当它执行jQuery.parseJSON时,也就是它被截断的时候
更新2
在删除其中一个值字符串中找到的值后,它将按预期工作。显然,字符串没有被截断,只是开发人员工具中可见的数据参数没有显示完整的字符串。您不能一次显示数千条记录。没有理由返回数千人。只需让autocomplete自己进行ajax调用,就像在jQueryUIWeb站点上一样 确保服务器端ajax端点将结果集过滤到合理的程度。。比如说20-25张唱片 一些提示:MVC控制器方法将希望返回JsonResult而不是视图。 另外,请确保将JsonResult设置为允许HttpGet作为JsonResult对象的属性: 类似于此VB,但您可以找到它:
$('#txtSearchTerms').autocomplete({
source: function (request, response) {
$.ajax({
url: '@Context.Request.Url.Scheme://@Context.Request.Url.Host:@Context.Request.Url.Port/Ajax/ProductSearch/' + $('#txtSearchTerms').val(),
dataType: 'json',
data: {},
success: function (data) {
response($.map(data, function (item) {
return {
label: iitem.Name,
value: item.ProductID,
id: item.ProductID
}
})) // response
} // success
}) // ajax
} // source function
});
<HttpGet>
Public Function ProductSearch(term As String) As JsonResult
Dim payload As SomeModel = Nothing
Using database As WebDataContext = New WebDataContext
database.Configuration.CreateProxies = False
payload = (From p In database.Products Where p.Name.Trim.ToLower.StartsWith(term.Trim.ToLower) Select p).Take(25).ToList
End Using
Return New JsonResult With {.Data = payload, .JsonRequestBehavior = JsonRequestBehavior.AllowGet}
End Function
你是否应该有一个这么长的字符串是一个好问题,你应该回答,但这是一个单独的主题 根据我的经验,如果您遇到未捕获的语法错误:意外的字符串错误,则字符串中有一些未转义的字符导致它失败,例如“;:” 鉴于较短的字符串有效,可能它是完整结果末尾的记录之一,带有无效字符 您看到的截断可能只是您在浏览器中访问字符串的方式造成的,而不是对JSON字符串大小的限制。鉴于您上次更新的完整字符串已经存在,我推测发送到解析器的字符串没有被截断
我建议您仔细查看完整字符串,并检查值中是否有未替换的字符。出于好奇,为什么字符串这么长?当然,在这种情况下,一些划分是有益的。通常情况下并非如此,但在这种情况下,自动完成是为了帮助用户选择现有的零件号。在我的测试数据库中,这是5900个部件,但我的客户可以有1000个。自动完成设置为,如果大于1000,则必须至少键入1个字符,>2000,然后键入2个字符。这对于快速选择来说已经足够了……如果我能让它呈现的话。虽然我意识到JSON并不是无限的……但我确实希望它允许超过31K个字符。@davids,看起来你所做的应该是方向,根据db的大小需要几个键,所以它会限制结果…@Noctis很好的建议,但他目前的要求似乎不行。如果你读了我的问题,你会发现字符串是有效的。被派去做白费力气的事是没有用的。然而,仔细观察后,我发现实际上有一个无效字符;感谢您信任您的经验和分享!我不确定我最初测试的是什么,但它显然不是完整的字符串。