【发布时间】: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.resultinsted ofresultList -
谢谢,但问题不在于我不知道如何迭代我的 json。问题是,字符串响应无法解析为 json,我不明白为什么。
-
你可以查看你的json原始返回什么?使用这个
JSON.stringify(resultList);
标签: javascript java jquery json ajax