JQPlot, JSON и ошибка "Данные не указаны"

Я пытаюсь использовать JQPlot в приложении VB.NET под .NET 3.5. При нажатии кнопки с помощью jquery я пытаюсь заполнить диаграмму JQPlot данными, полученными из JSON, с помощью исходного файла веб-служб ASP.NET (который является частью решения).

Данные JSON отправляются веб-службой, но когда они представляются в JQPlot, я получаю ошибку javascript «Данные не указаны», которая генерируется кодом JQPlot.

Мой листинг кода выглядит следующим образом:

Код для прослушивания нажатия кнопки:

$(document).ready(function () {
 $('#<%=btnASMX1.ClientID%>').click(function () {
  getElectricDataJSON();
 return false;
 });
});

Код Javascript вне функции document.ready:

function ajaxDataRenderer() {
 var ret = null;
 $.ajax({
  // have to use synchronous here, else the function 
  // will return before the data is fetched
  async: false,
  //url: url,
  type: 'POST',
  contentType: 'application/json; charset=utf-8',
  url: "AccountsService.asmx/GetJSONData",
  data: "{AccountID: " + $('#<%= hiddenAccountID.ClientID%>').val() + " }",
  dataType: "json",
  success: function (response) {
   var ret = response.d;
   // The following two lines just display the JSON data for testing purposes
   $('#<%=outputASMX.ClientID%>').empty();
   $('#<%=outputASMX.ClientID%>').html("<div>" + ret + "</div>");
   return ret;
  },
  error: function (request) {
   $('#<%=outputASMX.ClientID%>').html("<div style='color:red;'>WEBSERVICE UNREACHABLE</div>");
  }
 });
 return ret;
};

var jsonurl = "./jsondata.txt";

function getElectricDataJSON() {
 var ret = ajaxDataRenderer();
 var plot1 = $.jqplot('chart2', jsonurl, {
 title: "AJAX JSON Data Renderer",
 dataRenderer: ret, //$.jqplot.ciParser
 dataRendererOptions: {
  unusedOptionalUrl: jsonurl
 }
});
}

Формат данных JSON следующий:

[ { "todate": "2013-09-23T00:00:00", "Bill": 7095.65 }, { "todate": "2013-08-22T00:00:00", "Bill": 1137.96 }, { "todate": "2013-07-24T00:00:00", "Bill": 220429.41 }, ... ]

Любая помощь или совет будут оценены.


person normality2000    schedule 18.10.2013    source источник
comment
Помог ли мой ответ? Прошу прощения, если начальная фраза в ответе довольно прямолинейна!   -  person Ben Smith    schedule 23.10.2013
comment
@Fresh Оказалось, что мне нужно преобразовать данные, отправленные веб-службой, из строкового объекта в массив JSON. После var ret = ajaxDataRenderer(); в функции getElectricDataJSON () я вставил var ret = JSON.parse(ret);, а затем // Теперь помещаем необходимые данные в объект массива JSON var sampleData = [], item; $ .each (ret, function (key, value) {sampleData.push ([value.todate, parseFloat (value.Bill.replace (/, / g,))]);});   -  person normality2000    schedule 23.10.2013


Ответы (2)


Спасибо @Fresh за быстрый ответ. Вот полное решение моей проблемы:


Код для прослушивания нажатия кнопки:

$(document).ready(function () {
 $('#<%=btnASMX1.ClientID%>').click(function () {
  getElectricDataJSON();
 return false;
 });
});

JS-функция для получения данных из веб-службы:

function ajaxDataRenderer() {
 var ret = null;
 $.ajax({
  // have to use synchronous here, else the function 
  // will return before the data is fetched
  async: false,
  type: 'POST',
  contentType: 'application/json; charset=utf-8',
  url: "AccountsService.asmx/GetJSONData",
  data: "{AccountID: " + $('#<%= hiddenAccountID.ClientID%>').val() + " }",
  dataType: "json",
  success: function (response) {
    ret = response.d; // return response string object
  },
  error: function (request) {
   $('#<%=outputASMX.ClientID%>').html("<div style='color:red;'>WEBSERVICE    UNREACHABLE</div>");
  }
 });
 return ret;
};

Структура данных, выводимая веб-службой, следующая:

[ { "todate": "2013-09-23T00:00:00", "Bill": 7,095.65 }, { "todate": "2013-08-22T00:00:00", "Bill": 1,137.96 }, { "todate": "2013-07-24T00:00:00", "Bill": 220,429.41 }, ... ]

Структура данных, которую ожидает JQPlot:

[ [ "2013-09-23T00:00:00", 7095.65 ] , [ "2013-08-22T00:00:00", 1137.96 ], [ "2013-07-24T00:00:00", 220429.41 ], ... ]

Обратите внимание на удаление запятой в поле Bill "Ожидаемые данные".


И, наконец, функция getElectricDataJSON (), которая вызывается btnASMX1, где 'chart2' - это идентификатор тегов div, в которых будет отображаться диаграмма.

function getElectricDataJSON() {

 // Get JSON 'string' object
 var ret = ajaxDataRenderer();

 // If JSON string object is null, stop processing with friendly message
 if (ret == null) {
   $('#<%=outputASMX.ClientID%>').html("<div style='color:red;'>CHARTS ARE NOT AVAILABLE AT THIS TIME</div>");
   return false;
 }

 // Now push required data into a JSON array object
 var sampleData = [], item;
 $.each(ret, function (key, value) {
   sampleData.push([value.todate, parseFloat(value.Bill.replace(/,/g, ""))]);
 });

 var plot = $.jqplot('chart2', [sampleData], {
   title: 'AJAX JSON Data Renderer',
   dataRenderer: sampleData,
   ...      
 });
}
person normality2000    schedule 23.10.2013

Сигнатура метода для вашего средства хранения данных (например, ajaxDataRender) неверна. Подпись должна выглядеть так:

function (userData, plotObject, options) {... вернуть данные; }

(См. Документацию здесь)

В вашем примере вы передаете datarenderer "ret", который не является функцией с правильной подписью datarenderer. Также jsonurl, который вы передаете в getElectricDataJSON (), является избыточным, так как ни в одном месте вашего кода данные из «AccountsService.asmx / GetJSONData» не сохраняются в «./jsondata.txt».

Следовательно, вы должны изменить свой код на этот:

$(document).ready(function(){
 function ajaxDataRenderer(url, plot, options) {
  var ret = null;
  $.ajax({
   // have to use synchronous here, else the function 
   // will return before the data is fetched
   async: false,
   url: url,
   dataType: "json",
   success: function (response) {
    var ret = response;
    // The following two lines just display the JSON data for testing purposes
    $('#<%=outputASMX.ClientID%>').empty();
    $('#<%=outputASMX.ClientID%>').html("<div>" + ret + "</div>");
   },
   error: function (request) {
    $('#<%=outputASMX.ClientID%>').html("<div style='color:red;'>WEBSERVICE UNREACHABLE</div>");
   }
  });
  return ret;
 };

 var url = "AccountsService.asmx/GetJSONData";

 function getElectricDataJSON() {
  var plot1 = $.jqplot('chart2', url, {
  title: "AJAX JSON Data Renderer",
  dataRenderer: ajaxDataRenderer,
 });
}
person Ben Smith    schedule 21.10.2013
comment
Я предполагаю, что объект jsonurl в функции getElectricDataJSON следует изменить на url? Когда я это делаю, я получаю сообщение «Данные не указаны», сгенерированное из jquery.jqplot.js. Я выясню, какие данные передаются моей веб-службой, поскольку я подозреваю, что она передает строку, а не объект, содержащий истинные данные, удобные для JSON. - person normality2000; 23.10.2013
comment
Да, я обновил свой пример, так что $ .jqplot передается URL-адрес. Если ваш вызов ajax работает, ваш метод успеха должен отображать результат на экране. Другой подход, который вы можете использовать, - это не использовать загрузчик данных, а вместо этого передавать json непосредственно в jqplot. См. Мой ответ здесь - person Ben Smith; 23.10.2013