解析一个长的JSON字符串抛出"未捕获的语法错误:意外的字符串"

时间:2013-11-06 23:04:04

标签: c# json asp.net-mvc-3

我有一个c#.net MVC应用程序。我正在使用jQuery UI自动完成。我创建了一个有效的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页和424,638个字符(包括空格)。

当我看到返回视图的html专门检查结果值时,我可以看到字符数减少到31,424。因为它被截断,JSON无效,我收到错误“Uncaught Syntax Error:Unexpected String”

如果我限制返回的记录,那么它全部再次起作用。但是,我做不到。我需要所有值作为选项。

处理此问题的最佳方法是什么?我可以确保将完整的JSON字符串返回到视图吗?是否有另一种方法为自动完成创建对象?或者,我是否需要人为地限制JSON的长度,然后将结果合并到视图中?

对此有任何帮助表示赞赏。到目前为止,谷歌搜索一直没有用。

更新

我只是看得更近一点,现在看到完整的字符串传递给视图。 AJAX调用中返回的数据具有完整字符串。但是,当它执行jQuery.parseJSON时,它就会被截断。

更新2

删除其中一个值字符串中找到的"后,一切都按预期工作。显然字符串没有被截断,只是开发人员工具中可见的data参数没有显示完整的字符串。

2 个答案:

答案 0 :(得分:1)

您无法一次显示数千条记录。没有理由返回数千人。只需让autocomplete自己进行ajax调用,就像jQuery UI网站上的demonstrated一样。

确保您的服务器端ajax端点将结果集过滤到合理的位置。比如说20-25条记录。

一些提示:您的MVC控制器方法将要返回JsonResult而不是View。 另外,请务必将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

答案 1 :(得分:1)

你是否应该有一个长或不长的字符串是一个很好的问题(你应该回答一个问题),但是一个单独的主题。

根据我的经验,如果您收到“未捕获的语法错误:意外的字符串”错误,则字符串中会有一些未转义的字符导致其失败(例如'“;:)。

鉴于较短的字符串有效,也许它是带有无效字符的完整结果末尾的记录之一。

您看到的截断可能只是您在浏览器中访问字符串的结果,而不是对JSON字符串大小的限制。鉴于您的最后一个UPDATE是完整的字符串,我推测发送给解析器的字符串不会被截断。

我建议您仔细查看完整字符串并检查值中未转义的字符。