【问题标题】:how to loop through json element tag如何遍历json元素标签
【发布时间】:2014-07-13 04:31:44
【问题描述】:

我是 json 新手。我不久前完成了关于 json 的研究,但我对如何控制 json 输出仍然知之甚少。我制作了一个使用 ajax 从控制器获取 json 数据的购物车,并尝试解析输出。最终我没有得到结果。其声明未定义。

这是我的草稿

loop hypermart json element { 

    loop productname element{
        get price based on productname + price
    }
}

所以每个市场都有相同的产品名称和不同的价格。我怎样才能实现这种输出?我被我还没有答案的问题所困。

这是json数据

[{
    "productId":1002,
    "productName":"Moghul Faiza Basmathi",
    "productPic":"",
    "brandName":"Faiza",
    "productVolume":"5kg",
    "barcode":"9555035703811",
    "manufacturer":"Faiza",
    "createdBy":{
        "userId":2,
        "username":"pak.ijan",
        "password":"********",
        "fullName":"Hizan Ahmad",
        "sessionId":"********"},
        "dateCreated":"Jul 9, 2014 3:52:08 AM",
        "modifiedBy":{
            "userId":2,"username":"pak.ijan",
            "password":"********",
            "fullName":"Hizan Ahmad",
            "sessionId":"********"},
            "lastModified":"Jul 9, 2014 3:52:08 AM",
            "status":1,
    "price":[{
        "priceId":0,
        "hypermart":{
            "hypermartId":1,
            "hypermartName":"Tesco",
            "hypermartLogo":"",
            "status":1},
        "priceDate":"Jul 13, 2014 12:17:46 PM",
        "productPrice":0.0,"status":1},
        {"priceId":1,
        "hypermart":{
            "hypermartId":2,
            "hypermartName":"Giant",
            "hypermartLogo":"",
            "status":1},
        "priceDate":"Jul 13, 2014 12:17:46 PM",
        "productPrice":0.0,"status":1},
        {"priceId":2,
        "hypermart":{
            "hypermartId":3,
            "hypermartName":"Jusco",
            "hypermartLogo":"",
            "status":1},
        "priceDate":"Jul 13, 2014 12:17:46 PM",
        "productPrice":0.0,
    "status":1}],
    "tag":"beras faiza basmathi moghul",
    "description":"Moghul Faiza Basmathi",
    "category":{
        "categoryId":7,
        "descEn":"Food",
        "descMy":"Makanan"}
}]

【问题讨论】:

  • 您可以使用for 开始迭代。想法?
  • 如果您有足够的能力编写 JavaScript 并通过 Ajax 访问服务器以获取响应,您应该意识到您的 jquery ajax 调用已经解析了响应并且您有一个普通的旧 JavaScript 对象。那里不再有 JSON。因此,从 JavaScript 对象中提取数据。同样,它不再是 JSON。您的问题是如何导航 JavaScript 对象?
  • 顺便问一下,什么是“Moghul Faiza Basmathi”:-)?某种大米?

标签: javascript jquery ajax json


【解决方案1】:

假设你从你的服务器得到一个数据字符串,比如

var myDataJson = [{
  "productId":1002,
  ...
  "price":[{
    "priceId":0,
    "hypermart":{
        "hypermartId":1,
        "hypermartName":
  ...
 }]

现在很简单。你必须解析myDataJson。结果,您立即获得了一个真正的 JavaScript 对象。请记住,JSON 表示 JavaScript 对象表示法。

因此,一种现代的解析方式是:

try {
  var myCartData = JSON.parse(myDataJson);
} catch (ex) {
  ...
}

现在您可以像访问其他所有 Javascript 对象一样访问您的真实 Javascript 对象:

for (key in myCartData) {
   var product = myCartData[key];
   var price = product['price'][0]['productPrice'];
   ...
}

您可能应该寻找其他方法来解析您的 JSON 字符串,因为旧浏览器不支持 JSON.parse()。这里有很多想法:Parse JSON in JavaScript?

【讨论】:

    【解决方案2】:

    很容易循环出一个一个元素的递归。为此,您应该从头开始学习并花一些时间学习。

    我正在努力为您解决。

    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <script>
    var data = [
        {
            "productId": 1002,
            "productName": "Moghul Faiza Basmathi",
            "productPic": "",
            "brandName": "Faiza",
            "productVolume": "5kg",
            "barcode": "9555035703811",
            "manufacturer": "Faiza",
            "createdBy": {
                "userId": 2,
                "username": "pak.ijan",
                "password": "********",
                "fullName": "Hizan Ahmad",
                "sessionId": "********"
            },
            "dateCreated": "Jul 9, 2014 3:52:08 AM",
            "modifiedBy": {
                "userId": 2,
                "username": "pak.ijan",
                "password": "********",
                "fullName": "Hizan Ahmad",
                "sessionId": "********"
            },
            "lastModified": "Jul 9, 2014 3:52:08 AM",
            "status": 1,
            "price": [
                {
                    "priceId": 0,
                    "hypermart": {
                        "hypermartId": 1,
                        "hypermartName": "Tesco",
                        "hypermartLogo": "",
                        "status": 1
                    },
                    "priceDate": "Jul 13, 2014 12:17:46 PM",
                    "productPrice": 100,
                    "status": 1
                },
                {
                    "priceId": 1,
                    "hypermart": {
                        "hypermartId": 2,
                        "hypermartName": "Giant",
                        "hypermartLogo": "",
                        "status": 1
                    },
                    "priceDate": "Jul 13, 2014 12:17:46 PM",
                    "productPrice": 250,
                    "status": 1
                },
                {
                    "priceId": 2,
                    "hypermart": {
                        "hypermartId": 3,
                        "hypermartName": "Jusco",
                        "hypermartLogo": "",
                        "status": 1
                    },
                    "priceDate": "Jul 13, 2014 12:17:46 PM",
                    "productPrice": 370,
                    "status": 1
                }
            ],
            "tag": "beras faiza basmathi moghul",
            "description": "Moghul Faiza Basmathi",
            "category": {
                "categoryId": 7,
                "descEn": "Food",
                "descMy": "Makanan"
            }
        }
    ];
    
    $(document).ready(function(){   
    
        var martDict = getPriceByName("Moghul Faiza Basmathi")
        console.log(martDict);
        var martDetail = "martDetail";
        var hypermartName = "hypermartName";
        var martPrice = "martPrice";
    
        for(i in martDict){
            //console.log(martDict[i]);
            //console.log(martDict[i][martDetail]);
            //console.log(martDict[i][martDetail][hypermartName]);
            var martName = martDict[i][martDetail][hypermartName];
            var price = martDict[i][martPrice]
            console.log(martName+" -> "+price);
        }
    });
    
    function getPriceByName(name){
        var productName = "productName";
        var price = "price";
        var hypermart = "hypermart";
        var productPrice = "productPrice";
        var martDict = [];
        //console.log(name);
        for(i in data){
            if(data[i][productName] == name){
                //console.log(data[i][productName]);
                var priceList = data[i][price];
                //console.log(priceList);
                for(j in priceList){
                    //console.log(priceList[j]);
                    //console.log(priceList[j][hypermart])
                    var martDetail = priceList[j][hypermart];
                    var martPrice = priceList[j][productPrice];
                    martDict.push({"martDetail":martDetail,"martPrice":martPrice});
                }
            }
        }
    
        return martDict;
    }
    </script>
    

    如果您没有得到答案,请详细说明您的问题。

    我已按原样放置所有控制台注释,以便您通过一一打开 cmets 获得更好的主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多