Почему синтаксический анализ ответа jSON на ajax-запрос jQUERY не работает - PullRequest
0 голосов
/ 29 декабря 2010

Я знаю, что есть несколько похожих вопросов по SO, я использовал некоторые из них, чтобы пройти этот путь. Я пытаюсь перечислить набор URL, которые соответствуют моим входным значениям. У меня есть сервлет, который принимает некоторые данные, например «aus» в приведенном ниже примере возвращает некоторый результат, используя out.print (), например, два URL, которые я показал ниже.

ПРИМЕР

Именно это я и хочу. Я видел, что у firebug, похоже, ничего нет в разделе ответов, несмотря на то, что он вызвал out.print(jsonString);, и кажется, что out.print(jsonString); работает, как и ожидалось, что предполагает, что переменная 'jsonString' содержит ожидаемые значения.

Однако я не совсем уверен, что не так.

-------- 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 - и возвращает результаты -------

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 ]

3 голосов
/ 29 декабря 2010

Вы должны пропустить период, здесь:

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

должно быть:

for (var i = 0, len = data.length; i < len; ++i) {
2 голосов
/ 29 декабря 2010
  1. Ваш обработчик success пытается сослаться на переменную datalength, которая не существует. Вы, вероятно, имели в виду data.length.

  2. В этой же функции вы нигде не объявляете len, тем самым становясь жертвой Ужаса неявных глобалов . Да, вы объявляя это, я пропустил запятую. Спасибо, Ник.

  3. application/j-son не является типом JSON MIME. Это application/json. Но это нормально, нет необходимости переопределять это в любом случае. Вы отправляете правильный тип контента с сервера, и вы также указываете jQuery обрабатывать его как JSON независимо от того, что говорит сервер.

  4. Вы заменяете содержимым вашего элемента output на каждой итерации цикла; Вы имели в виду append, а не html?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...