2014-03-24 3 views
0

Способ управления:Некорректное выход после JSON.parse (...)

@RequestMapping(value = "channelIntentionDetails.html", method = RequestMethod.POST) 
    public @ResponseBody 
    Report getChannelIntentionDetails(@RequestBody SearchParameters searchParameters) { 
    LOGGER.info("In ReportController.getChannelIntentionDetails(...), searchParameters " + searchParameters); 

    return channelDetailsService.getIntentionDetails(searchParameters); 
    } 

Отчет POJO:

public class Report { 

    private Map<String, Collection<String>> parameterWiseResult; 
    private Collection<String>    results; 
    private String       result; 
    private String       spid; 
. 
. 
. 
} 

В результаты коллекция держит JSON строки, возвращаемые из коллекции MongoDB

Фрагмент JS AJAX:

var xmlhttp = new XMLHttpRequest(); 
    xmlhttp.open("POST","channelIntentionDetails.html",false); 
    xmlhttp.setRequestHeader("Content-Type","application/json"); 
    xmlhttp.setRequestHeader("Accept","application/json"); 
    xmlhttp.send(stringifiedSearchParameter); 

    alert("Plain AJAX response "+ xmlhttp.response); 
    alert("After JSON.parse(...) "+ (JSON.parse(xmlhttp.response)).results); 

drawIntentionPieChart((JSON.parse(xmlhttp.response)).results); 

function drawIntentionPieChart(data) { 

     //alert("In drawIntentionPieChart(...) " + intentionGooglePieChart); 

     if (intentionGooglePieChart == null 
       || intentionGooglePieChart == 'undefined') { 
      //alert("Creating new intentionPiechart"); 
      intentionGooglePieChart = new google.visualization.PieChart(
        document.getElementById('intentionPiechart')); 
     } 

     intentionGooglePieChart.clearChart(); 

     //var jsonData = JSON.parse(data); 
     var jsonData = data; 

     var data = new google.visualization.DataTable(); 
     data.addColumn('string', 'Intention'); 
     data.addColumn('number', 'Share'); 

     for (i = 0; i < jsonData.length; i++) { 

      /* alert("Intention : " + jsonData[i]._id.Intention_category 
        + " Count : " + jsonData[i].count); */ 

      data.addRows([ [ jsonData[i]._id.Intention_category, 
        parseInt(jsonData[i].count) ] ]); 

     } 

     var options = { 
      title : 'Intention Analysis', 
      titleTextStyle : { 
       color : '#0E5EAE' 
      }, 
      fontSize : 14, 
      width : 390, 
      height : 200 

     }; 

     intentionGooglePieChart.draw(data, options); 
    } 

Первое предупреждение, где "результаты" является массивом

Plain AJAX response {"parameterWiseResult":null,"results":["{ \"_id\" : { \"SpId\" : 352 , \"Intention_category\" : \"Opine\" , \"Report_Id\" : 2 , \"Channel_Id\" : 1} , \"count\" : 1}","{ \"_id\" : { \"SpId\" : 352 , \"Intention_category\" : \"Wish,Purchase\" , \"Report_Id\" : 2 , \"Channel_Id\" : 1} , \"count\" : 1}","{ \"_id\" : { \"SpId\" : 352 , \"Intention_category\" : \"Complain\" , \"Report_Id\" : 2 , \"Channel_Id\" : 1} , \"count\" : 1}","{ \"_id\" : { \"SpId\" : 352 , \"Intention_category\" : \"Purchase\" , \"Report_Id\" : 2 , \"Channel_Id\" : 1} , \"count\" : 2}","{ \"_id\" : { \"SpId\" : 352 , \"Intention_category\" : \"None\" , \"Report_Id\" : 2 , \"Channel_Id\" : 1} , \"count\" : 93}"],"result":null,"spid":null,"idvallistsearchprofile":null,"idvallisttags":null,"spmaster":null,"competitiveParameters":null} 

Второе предупреждение, где после JSON.parse (...), массив брекет именно. [] отсутствуют:

After JSON.parse(...) { "_id" : { "SpId" : 352 , "Intention_category" : "Opine" , "Report_Id" : 2 , "Channel_Id" : 1} , "count" : 1},{ "_id" : { "SpId" : 352 , "Intention_category" : "Wish,Purchase" , "Report_Id" : 2 , "Channel_Id" : 1} , "count" : 1},{ "_id" : { "SpId" : 352 , "Intention_category" : "Complain" , "Report_Id" : 2 , "Channel_Id" : 1} , "count" : 1},{ "_id" : { "SpId" : 352 , "Intention_category" : "Purchase" , "Report_Id" : 2 , "Channel_Id" : 1} , "count" : 2},{ "_id" : { "SpId" : 352 , "Intention_category" : "None" , "Report_Id" : 2 , "Channel_Id" : 1} , "count" : 93} 

Позже я получаю ошибки при попытке повторить этот результат анализа.

TypeError: jsonData [я] ._ идентификатор не определен

data.addRows([ [ jsonData[i]._id.Intention_category, 
parseInt(jsonData[i].count) ] ]); 

Где я Мессинг?

+0

Исправленный результат возвращает массив объектов ... Как вы выполняете повторный анализ результата? Можете ли вы поделиться фрагментом кода. – Uttam

+0

Добавлен фрагмент, в котором появляется ошибка. –

+0

Содержимое массива представлено в виде строк с двойными кавычками для каждого объекта. Вам нужно изменить веб-службу, чтобы вернуть содержимое в виде объектов вместо строк. – Uttam

ответ

0

Есть 2 решение проблемы.

Вариант 1: Изменение формата данных, возвращенного от службы

Ваш ПНМО должен выглядеть, как показано ниже, если вы хотите, чтобы вернуть коллекцию/массив объектов из веб-службы.

public class Report { 

    private Map<String, Collection<String>> parameterWiseResult; 
    private Collection<MyObject>   results; 
    private String       result; 
    private String       spid; 

    //Setters and Getters 
} 

public class MyObject { 

    private Id _id; 
    private int count; 

    //Setters and Getters 

    private class Id { 
     int SpId; 
     String Intention_category; 
     int Report_Id; 
     int Channel_Id; 

     //Setters and Getters 
    } 
} 

Вариант 2: Двойной синтаксический анализ строки для преобразования внутренней строки в объект в Javascript. Внутри цикла вам нужно проанализировать каждый элемент массива на JSON, как показано ниже:

var myJson = JSON.parse(jsonData[i]); 
data.addRows([ [ myJson._id.Intention_category, parseInt(myJson.count) ] ]); 
+0

Вариант 1: Невозможно, так как есть большой нет. разрозненных отчетов и другого MyObject не может быть создан Вариант 2: На месте уже, но это ужасное обходное решение :( –

+0

Вариант 1: Если имеется большое количество несопоставимых отчетов и невозможно определить разные объекты, затем возьмите общую коллекцию (например, HashMap), чтобы хранить пары ключей и значений вместо строки. Вариант 2: Я тоже понимаю, что это ужасное обходное решение. – Uttam

+0

Если вы используете определенную библиотеку json (например, библиотеку Gson от Google) для сериализации вашего json на контроллере, преобразует hashmap в jsonObject – Uttam

Смежные вопросы