【问题标题】:Jquery, ajax and JSON: Parsing GET response fails, but only sometimes?Jquery、ajax 和 JSON:解析 GET 响应失败,但只是有时?
【发布时间】:2018-01-07 04:53:03
【问题描述】:

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

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

这是我在 java 控制台中的 servlet 中显示的 json 结构:

[{"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 并告诉我为什么它是无效的?还是问题可能是其他原因?谢谢。

【问题讨论】:

  • 您可以使用JSON.parse(),因为作为响应获取为字符串,因此必须首先解析 json。如果您验证 json,请检查此jsonlint.com
  • 嘿,我刚刚这样做了,jsonlint 和 jsonformatter 告诉我我的 json 是有效的。我在我的 ajax 回调中尝试了JSON.parse(),但正如我所写的那样,它给了我一个错误。但是,应该没有必要使用它,因为无论如何我都指定了"datatype": "json"
  • 你可以试试console.log(resultList[i].key); 或者试试这个resultList.result insted of resultList
  • 谢谢,但问题不在于我不知道如何迭代我的 json。问题是,字符串响应无法解析为 json,我不明白为什么。
  • 你可以查看你的json原始返回什么?使用这个JSON.stringify(resultList);

标签: javascript java jquery json ajax


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    好的,我解决了问题:问题出在我的 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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多