2013-07-20 2 views
0

Когда я отправляю массив объектов json, мой метод jjery ajax способен анализировать содержимое и отображать данные в listview jquery, но когда у меня есть только один объект my тот же метод jquery ajax не может анализировать данные.Метод Jquery Ajax, работающий с несколькими объектами json, но не с одним объектом json

здесь мой JSON массив объектов:

{"menuService":[{"idmenu":"0","itemCatagory":"Main Course","itemDescription":"Food from UP","itemImagePath":"http://localhost:8080/fotservice/ItemImage?id=Steam Rice","itemName":"Steam Rice","rate":"100.5","subItemName":"Half Plate Steam Rice","subItemNameRate":"100.5"},{"idmenu":"5","itemCatagory":"Main Course","itemDescription":"tasty lunch","itemImagePath":"http://localhost:8080/fotservice/ItemImage?id=Lunch Combo(raita,rice,dal,salad)","itemName":"Lunch Combo(raita,rice,dal,salad)","rate":"123.0","subItemName":"lunch(dal,rice)","subItemNameRate":"100.5"}]} 

вот мой единственный объект JSON:

{"menuService":{"idmenu":"2","itemCatagory":"xyz","itemDescription":"fghjkl;","itemImagePath":"http://localhost:8080/fotservice/ItemImage?id=Dal makhni","itemName":"Dal makhni","rate":"121.5","subItemName":"Half plate Dal makhni","subItemNameRate":"121.56"}} 

и вот мой метод JQuery Ajax:

$.ajax({ 
    url: "http://localhost:8080/fotservice/rest/menu/"+cat+"/items", 
    type: 'GET', 
    dataType: 'json', 
    contentType: "application/json; charset=utf-8", 
    success: function(response) { 
     var markup = ""; 
     $.each(response.menuService, function(index, result) { 
      var $template = $('<div><li> <a data-transition="slide" href="desc.html?cat='+result.itemName+'" rel="external" > <img class="profile"> <p class="from"> </p><p class="tweet"> </p></li></a></div>'); 
      $template.find(".profile").attr("src", result.itemImagePath); 
      $template.find(".from").append(result.itemDescription); 

      markup += $template.html(); 
     }); 
     $("#tweet-list").append(markup).listview("refresh", true); // The true parameter indicates we want to refresh the entire list, not just the list items. 

    }, 
    timeout: 6000, // Timeout after 6 seconds 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log("Error, textStatus: " + textStatus + " errorThrown: "+ errorThrown); 

     $.mobile.hidePageLoadingMsg(); 

     //show error message 
     $("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+ $.mobile.pageLoadErrorMessage +"</h1></div>") 
      .css({ "display": "block", "opacity": 0.96, "top": 100 }) 
      .appendTo($.mobile.pageContainer) 
      .delay(800) 
      .fadeOut(1000, function() { 
       $(this).remove(); 
      }); 
    } 
}); 

Я попытался JQuery getjson но это также приводит к такому же поведению.

+0

$ .each не может обрабатывать список объектов ('[{...}, {...}] ') так же, как он обрабатывает объект (' {...} '), потому что он выполняет итерацию через свои ключи в последнем случае. Вы можете отправить список одного объекта? – Brian

ответ

0
var mns = response.menuService; 

if (mns&& !mns.length) mns=[mns]; 
$.each(mns... 
0

проверить, если response.menuService массив с типом Jquery, если это не сделать один:

var success = function(response) { 
    var markup = ""; 
    var arrayResponse; 
    console.log(response.menuService); 
    if ($.type(response.menuService) !== 'array') { 
     var arrayResponse = []; 
     arrayResponse.push(response.menuService); 
    } else { 
     arrayResponse = response.menuService; 
    } 
    console.log(arrayResponse); 
    $.each(arrayResponse, function(index, result) { 
     $('#list').append('<div>' + result.idmenu + '</div>'); 
    }); 
}; 

var response = {"menuService":[{"idmenu":"0"}]}; 

success(response); 

var response = {"menuService":{"idmenu":"2"}}; 

success(response); 

я сделал Js скрипку, так что вы можете проверить: http://jsfiddle.net/U72p2/

0

Вы можете просто проверить, если это массив с Array.isArray, и если это не так, завернуть его в массив так $.each работает consitently

success: function(response) { 
    var markup = ""; 
    var menuService = Array.isArray(response.menuService) ? response.menuService : [response.menuService]; 

    $.each(menuService, function(index, result) { 
     ... 
    }); 

    ... 
0

Изменить формат JSON, как это и попробовать

{"menuService":[{"idmenu":"2","itemCatagory":"xyz","itemDescription":"fghjkl;","itemImagePath":"http://localhost:8080/fotservice/ItemImage?id=Dal makhni","itemName":"Dal makhni","rate":"121.5","subItemName":"Half plate Dal makhni","subItemNameRate":"121.56"}]} 

Или не использовать each и получить доступ к значению непосредственно как этот

response.menuService.itemImagePath 

Если вы используете тот же формат json затем обновить success обработчик как указано ниже:

success: function(response) { 
    var markup = ""; 
    var $template = $('<div><li> <a data-transition="slide" href="desc.html?cat=' + response.menuService.itemName + '" rel="external" > <img class="profile"> <p class="from"> </p><p class="tweet"> </p></li></a></div>'); 
    $template.find(".profile").attr("src", response.menuService.itemImagePath); 
    $template.find(".from").append(response.menuService.itemDescription); 
    markup += $template.html(); 
    $("#tweet-list").append(markup).listview("refresh", true); // The true parameter indicates we want to refresh the entire list, not just the list items. 
} 
Смежные вопросы