为什么解析对jQUERY ajax请求的jSON响应不起作用

时间:2010-12-29 14:46:54

标签: jquery ajax servlets

我知道SO上有几个类似的问题,我已经用了其中的一些来解决这个问题。我正在尝试列出一组与我的输入值匹配的网址。我有一个servlet,需要一些输入,例如下例中的“aus”并使用out.print()返回一些输出,例如我在下面展示的两个网址。

示例

  • 输入:“aus”
  • 输出:[{“url”:“http://dbpedia.org/resource/Stifel_Nicolaus”},{“url”:“http://sempedia.org/ontology/object/Australia”}]

这正是我想要的。我已经看到尽管已经调用了out.print(jsonString);,但似乎out.print(jsonString);正在按预期运行,表明变量'jsonString'包含期望值,但firebug在响应部分似乎没有任何内容。

但是我不确定是什么问题。

-------- jQuery ---------

$(document).ready(function() {
    $("#input").keyup(function() {
        var input = $("#input").val();
        //$("#output").html(input);
        ajaxCall(input);
    });
});

function ajaxCall(input) {
//  alert(input);
    $.ajax({
        url: "InstantSearchServlet",
        data: "property="+input,
        beforeSend: function(x) {
              if(x && x.overrideMimeType) {
               x.overrideMimeType("application/j-son;charset=UTF-8");
              }
             },
        dataType: "json",  
        success: function(data) {
                 for (var i = 0, len = datalength; i < len; ++i) {
                     var urlData = data[i];
                     $("#output").html(urlData.url);
                     }                  
            }
          });
        }

------调用DAO类的Servlet - 返回结果-------

public class InstantSearchServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

 System.out.println("You called?");
    response.setContentType("application/json");        
    PrintWriter out = response.getWriter();
    InstantSearch is = new InstantSearch();

    String input = (String)request.getParameter("property");
 System.out.println(input);

    try {
        ArrayList<String> urllist;

        urllist = is.getUrls(input);
        String jsonString = convertToJSON(urllist);
        out.print(jsonString);
  System.out.println(jsonString);

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

private String convertToJSON(ArrayList<String> urllist) {

    Iterator<String> itr = urllist.iterator();
    JSONArray jArray = new JSONArray();
    int i = 0;
    while (itr.hasNext()) {
           i++;
           JSONObject json = new JSONObject();
           String url = itr.next();
           try {
            json.put("url",url);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
           jArray.put(json);
        }

    String results = jArray.toString();
    return results;
}
} 

2 个答案:

答案 0 :(得分:3)

你必须错过一段时间,在这里:

for (var i = 0, len = datalength; i < len; ++i) {

应该是:

for (var i = 0, len = data.length; i < len; ++i) {

答案 1 :(得分:2)

  1. 您的success处理程序正在尝试引用不存在的变量datalength。你可能意味着data.length

  2. 在相同的功能中,您没有在任何地方声明len,因此成为Horror of Implicit Globals的牺牲品。 是的,您宣布它,我错过了逗号。谢谢,尼克。

  3. application/j-son不是JSON MIME类型。它是application/json。但是没关系,在任何情况下都没有必要覆盖它。您正在从服务器发送正确的内容类型,并且您还告诉jQuery将其视为JSON,无论服务器说什么。

  4. 您在循环的每次迭代中替换 output元素的内容;你的意思是append而不是html