访问JSONP的响应文本。将多个对象展平为文本

时间:2016-09-13 20:03:47

标签: javascript jquery json highcharts

我正在拉一些JSONP来检索数据以插入高级图表......

DOM.sinkEvents((com.google.gwt.user.client.Element) dropBox.getElement(), Event.ONCHANGE );
DOM.setEventListener((com.google.gwt.user.client.Element) dropBox.getElement(), new EventListener() {
    @Override
    public void onBrowserEvent(Event event) {
        if (DOM.eventGetType(event) == Event.ONCHANGE) {
              Window.alert("change fired");
              dropBox.addItem("who");
              consoleLog("selected: "+ dropBox.getSelectedIndex());                                        
        }                                             
    }
}); 

通过Firebug查看时,数据结构是(示例)....

$(function() {

  $.getJSON("http://xxxx.xxxxx&?callback=?", function(json){

  var data = json;
  var options = {
    xAxis: {
      type: 'datetime'
    },
    series: [{
      data: []
    }]
  }
  Highcharts.each(data, function(p, i) {
    for (var i = 0; i < p.length; i++) {
      options.series[0].data.push(
        [p[i].timeBucket, parseFloat(p[i].errors)]
      );
    }
  });

  $('#container').highcharts(options);
});
});

Firebug中显示的结构是10个对象,这是真的,但对于我的生活,我只是无法解析它。

结果,没有任何反应。

我所做的是卷曲响应并将其保存为&#34; data.json&#34;并相应地更改了我的代码......

[[{"timeBucket": XXXXXX, "errors": 10}],[{"timeBucket": XXXXXX, "errors": 30}],[{"timeBucket": XXXXXX, "errors": 20}]] ......

它像冠军一样!当我在console.log中时,我得到的类型是&#34;对象&#34; (单数),所以看来我需要以某种方式将所有这10个对象压缩成一个,并且不知道该怎么做。

我尝试过JSON.stringify而没有运气,我尝试过JSON.stringify(json)然后尝试JSON.parse(json)

当我在Firebug中看到响应文本时,它正是我正在寻找的。任何人都知道如何修改我的代码以使用诱人的和需要的响应Text而不是10个目标代码?

1 个答案:

答案 0 :(得分:2)

您可以使用jQuery.map重新映射它,以便您的对象位于一个数组中。

  

描述:将数组或对象中的所有项目转换为新的项目数组。

因此您必须将var data = json;替换为

var data = $.map(json,function(x,i){
  return x[0];
});

这将为您提供[{},{},{}]格式,您可以在循环中访问

 $.each(data, function(i,p) {
      options.series[0].data.push(
        [p.timeBucket, parseFloat(p.errors)]
      )
  });

或者,如果您想保留原始循环,您可以

for (var i = 0; i < data.length; i++) {
  options.series[0].data.push(
     [data[i].timeBucket, parseFloat(data[i].errors)]
  );
}

var x = [[{"timeBucket": 111, "errors": 10}],[{"timeBucket": 222, "errors": 30}],[{"timeBucket": 333, "errors": 20}]];

var data = $.map(x,function(x,i){
  return x[0];
});
$('#results').html(JSON.stringify(data));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='results'>