我正在使用 jquery 进行 ajax 调用,它返回一个 json 数组,并且在某些情况下工作正常。然而,在其他情况下,浏览器(ff 和 IE11)无法解析响应。我将脚本包含在 .jsp 文件中,如下所示:

<script type="text/javascript" charset="utf-8" src="../scripts/test.js"></script> 

这是 json 的结构,如 java 控制台中的 servlet 所示:

[{"key":"...","type":"...","content":"..."}, 
 {"key":"...","type":"...","content":"..."}, 
 ...] 

我的请求看起来像这样:

var url = document.location.origin + "/Servlet", 
        searchText = $("input[name=search]").val(), 
        types = getOptions(); 
 
 
$.ajaxSetup({ 
    type: "GET", 
    url: url,  
    data: {"operation": "search", "searchText": searchText, "types": types, "resultNumber": 200}, 
    datatype: "json", 
    success: function(result,status,xhr) 
    { 
        showResults(result);   
    }, 
    cache: false 
}); 
 
$.ajax(); 

我的用于创建 JSON 数组的 java 方法:

private JSONArray parseJSON (ArrayList<ResultObject> aResultList) throws JSONException 
    { 
        JSONArray resultJSONArray = new JSONArray(); 
 
        for (ResultObject resultObject : aResultList) 
        { 
            JSONObject jsonObject = new JSONObject(); 
            HashMap<String,String> fields = resultObject.getFields(); 
 
            for (Map.Entry<String, String> entry : fields.entrySet()) 
            { 
                jsonObject.put(entry.getKey(), entry.getValue()); 
            } 
            resultJSONArray.put(jsonObject); 
        } 
        return resultJSONArray; 
    } 

Servlet 响应如下所示:

protected void doGet(HttpServletRequest aRequest, HttpServletResponse aResponse)  
    throws ServletException, IOException  
    { 
                QueryObject queryObject = new QueryObject(); 
                queryObject.setSearchText(aRequest.getParameter("searchText")); 
                String[] types = aRequest.getParameterValues("types[]"); 
                queryObject.setTypes(types); 
                queryObject.setResultNumber(Integer.parseInt(aRequest.getParameter("resultNumber"))); 
 
                JSONArray results = indexManager.doSearch(queryObject); 
 
                System.out.println(results.toString()); 
 
                aResponse.getWriter().write(results.toString()); 
 
        aResponse.setContentType("application/json"); 
//      aResponse.setCharacterEncoding("UTF-8"); 
        PrintWriter out = aResponse.getWriter(); 
        out.flush(); 
    } 

我用 jquery 解析它,如下所示:

function showResults (resultList) 
{ 
    $.each(resultList, function(i, item)  
        { 
            console.log(item.key); 
        }); 
} 

调试显示,有时返回的 JSONarray 不会自动解析为 JSON,而是保留为字符串,这就是 $.each(..) 失败的原因。我无法确定为什么 jquery 解析它时出现问题,因为它没有给我任何错误消息。然而,使用 JSON.parse() 手动解析它告诉我它似乎无效。起初它使用 $.get(...) 执行请求,这在 FF 中运行良好,但在 IE 中则不行(缓存问题)。我认为这是德语特殊字符(元音变音)的问题,但事实并非如此。当 jsonarray 较大时(约 50 个对象或更多),这种情况似乎总是会发生。不幸的是,我无法在这里发布示例 json,因为它包含敏感数据。

我浪费了几个小时来解决这个问题,所以请有人知道这里出了什么问题吗?有没有任何工具可以帮助我验证我的 json 并告诉我它到底为什么无效?或者问题可能是由其他原因造成的?谢谢。

请您参考如下方法:

我会发表评论,但因为我还没有 50 名代表...

您可以使用此工具检查您的 JSON 是否有效 https://jsonlint.com/关于 JSON 太大,我不会打赌,JSON 数据 block 或任何字段的大小没有固定限制(为 jvm 分配了适量的堆内存)。各种浏览器的 JavaScript 实现可以处理的 JSON 量是有限的(例如,根据我的经验,大约 40MB)。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!