2010-11-02 72 views
2

我正在从服务器获取一些Json,以便在dom中动态构建一个表。 当有一个以上的对象的数据被作为对象返回的 一个这样的数组:如何处理有时在对象数组中返回的Json数据,有时只是一个对象?

{ 
    "ProductList": { 
     "Products": [{ 
      "ProductID": "1", 
      "Name": "ProdName"}, 
     { 
      "ProductID": "2", 
      "Name": "ProdName2"}] 
    } 
} 

然而当存在它被简单地返回一个对象只有一个对象,而不是这样的数组:

{ 
    "ProductList": { 
     "Products": { 
      "ProductID": "3", 
      "Name": "ProdName3" 
     } 
    } 
} 

所以,我一直在做的是检查,如果它是一个这样的数组:

if ($.isArray(productDetails.ProductList.Products) === true) { 
    for (i = 0; i < productDetails.ProductList.Products.length; i++) { 
     //Create the dom elements by accessing the object properties with [i] 
     //ie. productDetails.ProductList.Products[i].ProductsID 
    } 
} 
else { 
    //Create the dom elements by accessing the object properties w/o [i] 
    //ie. productDetails.ProductList.Products.ProductsID 
} 

它的工作原理,但我有很多Ø f代码,除了访问对象属性的方式完全相同,每当我改变一个我需要记住更改另一个或我会遇到问题。 在客户端是他们处理这个问题的更好方法吗?

+1

将子对象作为数组返回是不是更好,无论它是1还是多个对象? – RJD22 2010-11-02 16:03:44

回答

6

如果不是,将products转换为数组如何?

var products = productDetails.ProductList.Products; 
if (!$.isArray(products)) { 
    products = new Array(products); 
} 

... all logic here 
+0

这几乎是我用来处理JSON输出刚刚从XML转换而来的Web服务。 – 2010-11-02 16:04:39

3

...创建一个函数?

function maybeArray(obj, func) { 
    if ($.isArray(obj)) 
     $.each(obj, func); 
    else 
     func(0, obj); 
} 

... 

maybeArray(productDetails.ProductList.Products, function(i, product) { 
    create DOM element for `product`; 
}); 
+0

+1,也是一个很好的建议。 – 2010-11-02 16:06:02

0

使它始终是一个数组。

if(!$.isArray(productDetails.ProductList.Products)){ 
    productDetails.ProductList.Products = [productDetails.ProductList.Products]; 
} 
相关问题