Jquery,ajax和JSON:解析GET响应失败,但有时只是?

时间:2017-07-31 14:41:13

标签: javascript java jquery json ajax

我正在使用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并告诉我为什么它无效?或问题可能是其他原因造成的?感谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

好的,我解决了问题:问题出在我的servlet中。在将内容添加到编写器之前,我必须为响应开始设置内容编码属性。所以现在看起来像这样:

protected void doGet(HttpServletRequest aRequest, HttpServletResponse aResponse) 
    throws ServletException, IOException 
    {
        aResponse.setContentType("application/json");
        aResponse.setCharacterEncoding("UTF-8");
        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);

        aResponse.getWriter().write(results.toString());

        PrintWriter out = aResponse.getWriter();
        out.flush();
    }