簡體   English   中英

解析長的JSON字符串將引發“未捕獲的語法錯誤:意外的字符串”

[英]Parse a long JSON string throws “Uncaught Syntax Error: Unexpected String”

我有一個ac#.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無效,並且出現錯誤“未捕獲的語法錯誤:意外的字符串”

如果我限制返回的記錄,那么一切都會再次起作用。 但是,我做不到。 我需要所有值作為選項。

處理此問題的最佳方法是什么? 我可以確保將完整的JSON字符串返回給視圖嗎? 還有另一種方法來創建自動完成的對象嗎? 或者,我是否需要人為地限制JSON的長度,然后將結果合並到視圖中?

任何幫助,不勝感激。 到目前為止,谷歌搜索一直無濟於事。

UPDATE

我只是稍微靠近一點,現在看到完整的字符串正在傳遞給視圖。 AJAX調用中返回的數據具有完整的字符串。 但是,當它執行jQuery.parseJSON時,即被截斷了。

更新2

除去在值字符串之一中找到的"之后,所有功能均按預期工作。顯然該字符串並未被截斷,只是開發人員工具中可見的data參數未顯示完整的字符串。

您一次不能顯示數千條記錄。 沒有理由退還數千。 只是讓自動完成讓Ajax調用自身,因為證明了jQuery UI網站。

確保您的服務器端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

是否應該使用長字符串是一個好問題(應該回答),但這是一個單獨的主題。

以我的經驗,如果您遇到“未捕獲的語法錯誤:意外的字符串”錯誤,則字符串中有一些未轉義的字符會導致失敗(例如'“;::)。

考慮到較短的字符串有效,它可能是帶有無效字符的完整結果結尾處的記錄之一。

您看到的截斷可能只是您在瀏覽器中訪問字符串的方式而已,而不是JSON字符串大小的限制。 鑒於您上一次的更新是完整的字符串存在,我推測發送到解析器的字符串不會被截斷。

我建議您仔細查看完整的字符串並檢查值中的未轉義字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM