C# 解析长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

我有一个c.NETMVC应用程序。我正在使用jQueryUI自动完成。我已经创建了一个有效的JSON字符串发送到自动完成并将其添加到视图中,如下所示:

$(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很好的建议,但他目前的要求似乎不行。如果你读了我的问题,你会发现字符串是有效的。被派去做白费力气的事是没有用的。然而,仔细观察后,我发现实际上有一个无效字符;感谢您信任您的经验和分享!我不确定我最初测试的是什么,但它显然不是完整的字符串。