如何从Java Script中的ajax调用解析JSON对象

时间:2014-06-03 18:26:58

标签: java javascript ajax json

我正在我的JSP中进行Ajax调用,该调用正在接收JSON响应。

运行alert('Ajax Response ' + respArr);会显示以下屏幕:

Screenshot of Alert message

Java服务器端代码:

public void doGet(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException {
    try {
        String fromDate = request.getParameter("drFrom");
        String toDate = request.getParameter("drTo");
        JSONArray jsonArray = chartData.getCCSBJson(fromDate, toDate);
        res.setContentType("application/json");
        res.getWriter().write(jsonArray.toString());
    }

JavaScript:

if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    if(xmlhttp.responseText != null) {
        var respArr = xmlhttp.responseText;
        var jsonData = eval("(" + respArr + ")");
        alert('JSON Chart ' + jsonData); // The line from above
        var obj = JSON.parse(xmlhttp.responseText);
        alert('JSON Parse' + obj);

正在返回的JSON:

[
  {
    "chart":{
      "caption":"",
      "exportDataFormattedVal":"1",
      "numberPrefix":"",
      "showexportdatamenuitem":"1",
      "xAxisName":"Bureau usage",
      "yAxisName":"count"
    },
    "data":[
      {
        "label":"SB AutoDecison",
        "value":"0"
      },
      {
        "label":"CC AutoDecison",
        "value":"0"
      },
      {
        "label":"CC Judgemental",
        "value":"0"
      },
      {
        "label":"SB Judgemental",
        "value":"0"
      }
    ]
  }
]

警报结果:

alert('JSON Chart ' + jsonData) // JSON Chart[object Object]
alert('JSON Parse ' + obj);     // JSON parse[object Object]

我想要的是解析对象并从内容中生成Excel表格。

当我尝试循环时:

var jqueryData = jQuery.parseJSON(respArr);
var obj = JSON.parse(xmlhttp.responseText);
for (var i in obj) {
    alert('For loop string' + obj[i]);
}

使用JavaScript代码

会抛出7或8个警报
for (i = 0; i < 5; i++) {
    alert(i + ' of respArr ' + respArr[i]);
}

给JSON的一封又一封的信件:[{"ch等,以便循环的每次迭代

我是否可以直接遍历JSON,如respArr[0].datarespArr[0].chart

3 个答案:

答案 0 :(得分:1)

您的json响应具有以下结构:

[
   {
      "chart":{
         "caption":"",
         "exportDataFormattedVal":"1",
         "numberPrefix":"",
         "showexportdatamenuitem":"1",
         "xAxisName":"Bureau usage",
         "yAxisName":"count"
      },
      "data":[
         {
            "label":"SB AutoDecison",
            "value":"0"
         },
         {
            "label":"CC AutoDecison",
            "value":"0"
         },
         {
            "label":"CC Judgemental",
            "value":"0"
         },
         {
            "label":"SB Judgemental",
            "value":"0"
         }
      ]
   }
]

访问最外层对象的第一个元素,如response[0]。 然后是其中的图表对象,如response[0].chart,依此类推。 http://jsonformatter.curiousconcept.com/将帮助格式化JSON并使其可读。

答案 1 :(得分:1)

查看 FIDDLE

您可以直接访问对象的属性。

$(function () {

    var q = [{
        "chart": {
            "caption": "",
                "exportDataFormattedVal": "1",
                "numberPrefix": "",
                "showexportdatamenuitem": "1",
                "xAxisName": "Bureau usage",
                "yAxisName": "count"
        },
            "data": [{
            "label": "SB AutoDecison",
                "value": "0"
        }, {
            "label": "CC AutoDecison",
                "value": "0"
        }, {
            "label": "CC Judgemental",
                "value": "0"
        }, {
            "label": "SB Judgemental",
                "value": "0"
        }]
    }];

    console.log(q);
    console.log(q[0].data);
    q[0].data.forEach(function (item) {
        console.log(item.label);
        console.log(item.value);
    });

});

答案 2 :(得分:1)

有几件事:

首先,您的Java servlet并没有真正返回&#34;字符串&#34;。当您编写jsonArray.toString()时,是的,您正在将数组转换为字符串,但这仅仅是为了通过网络编写它。 HTTP是一种文本协议。那么,在某种意义上,doGet方法实际返回的是HTTP响应(它恰好是文本,它很可能是二进制)。

这样,当客户端(在这种情况下,您的JavaScript通过XMLHttpRequest)向您的服务器(您的servlet)发出GET请求时,它将返回JSON响应(是的,如同文本)。在这种情况下,您的xmlhttp.responseText变量应该包含您在问题中显示的JSON。

致电其中一个:

  • JSON.parse(xmlhttp.responseText)
  • jQuery.parseJSON(xmlhttp.responseText)
  • $.parseJSON(xmlhttp.responseText)

所有人都应该返回相同的对象。使用此对象,您可以按照自己的方式访问其属性。以下应该工作:

if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    if (xmlhttp.responseText != null) {
        var json = xmlhttp.responseText;
        var arr = JSON.parse(json);
        var data = arr[0].data;       // This is what you want to do?
        var chart = arr[0].chart;     // This is what you want to do?
        // try running alert(chart.xAxisName);
        // and so on

旁注:当您运行alert(obj); obj作为对象时,您会看到[object Object],因为这就是JavaScript将对象表示为字符串的方式。如果你想看到JavaScript对象的内部结构,正如其他人所指出的那样,你最好使用console.log(obj)。 (此外,升级或切换到更好的浏览器。您将可以访问更好的调试工具。)