在 JavaScript 中解析来自 servlet 的 JSON 数据

Parsing JSON data from servlet in JavaScript

我正在尝试使用 JQuery 解析从我在 JavaScript 中的 servlet 返回的 json 数据, 这是 JavaScript:

$(document).ready(function(){
//alert('document ready');
$('#search-btn').click(function(){
//  alert($('#searchbar').val());
    var url= 'http://localhost:8080/SMDE/Search?q='+$('#searchbar').val();
    //alert(url);
    var table='';
    $.get(url,function(response){
        //alert(response);
        if(response){
            //alert(response);
            $('#container').html(response);
            for(i=0;i<response.data.length;i++){
                var n= response.data[i].name;
                var c= reponse.data[i].category;
                var ii=response.data[i].id;
                table=table+"<div class='content'>" +
                        "<h3>Page Name :" +n+"<br/>"
                        "Category :" +c+"<br/>"
                        "</h3>" +
                        "<form action='/Profile' method='POST'>" +
                        "<input type='hidden' name='id' value='" +ii+
                        "'<input type='submit' class='btn' value='More...' /></form></div>";
            }
            $('#container').html(table);
        }
        if (response.error) {
              alert('Error - ' + response.error.message);
              //return
        } 
    });
}); });

当我取消注释 alert(response) 时;我得到正确的回应,但如果我提醒(response.data)它说未定义。 在浏览器中直接给出url的结果是:

{ "data": [
{
  "category": "Media\/news\/publishing",
  "name": "CNN",
  "id": "5550296508"
},
{
  "category": "Media\/news\/publishing",
  "name": "CNN International",
  "id": "18793419640"
},
{
  "category": "Tv show",
  "name": "CNN Heroes",
  "id": "86418982488"
},
{
  "category": "Tv network",
  "name": "CNN en Espa\u00f1ol",
  "id": "89613772643"
},
{
  "category": "Media\/news\/publishing",
  "name": "CNNMoney",
  "id": "6651543066"
},
{
  "category": "News\/media website",
  "name": "CNNM\u00e9xico",
  "id": "323626813995"
}] }

请帮忙处理数据。

servlet 代码是:

    import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.*;

/**
 * Servlet implementation class Search
 */
@SuppressWarnings("unused")
@WebServlet("/Search")
public class Search extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Search() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String key = request.getParameter("q");
        PrintWriter out = response.getWriter();
        String result = Facebook.callGet("search?q="+key+"&type=page");
        try{
            /*JSONObject json = new JSONObject(result);
            response.setContentType("application/json");
            out.print(json);*/
            out.println(result);
        }catch(Exception e){
            out.println("error");
        }
    }

}

$.get 读入原始响应数据。 response 是一个纯字符串,此时没有 json。

 $.get(url,function(response){
        var d = eval("("+response+")");
        alert(d.data);

此外,您的数据中没有关闭 ]

您需要设置响应内容类型以提示jQuery如何解释响应正文。在JSON的情况下,您需要将响应内容类型设置为application/json:

response.setContentType("application/json");

这样你就不需要像另一个答案中建议的那样使用丑陋的 security/error-prone 变通方法 eval() 来解决问题。

另请参阅:

  • How to use Servlets and Ajax?

您的 $.get() 方法似乎有问题。该方法异步工作,因此当您读取它时接收到的数据是未定义的。 alert 语句增加了整个过程的延迟。这就是为什么您在语句未注释时获取数据的原因。

  • 使用$.post
  • 设置 属性 async:false(使其同步)
  • 或者将UI渲染逻辑放在回调成功函数中