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