【问题标题】:I think I'm being stupid... but I can't get my JSON output properly我认为我很愚蠢......但我无法正确获得我的 JSON 输出
【发布时间】:2012-03-21 21:35:24
【问题描述】:

我正在尝试构建一个购物车。

有一个非常简单的类可以创建一个 generic.dictionary(of string, generic.dictionary(of string, string) 这包含我的购物车项目。

初始字典的键是商品 ID,因此我可以使用 cartDictionary.ContainsKey(id) 轻松检查商品是否已在购物车中,然后根据需要增加数量或添加新商品。

BUY 按钮触发和 AJAX 化的 web 方法,它返回如下所示的数据:

{
    "d": {
        "7907": {
            "id": "7907",
            "qty": "4",
            "singlePrice": "1185"
        },
        "2698": {
            "id": "2698",
            "qty": "1",
            "singlePrice": "1322"
        }
    }
}

初始项目d 是由AJAX 帖子自动创建的,原因我不明白,但这并不重要,因此在我的AJAX 成功中我的输出是data.d,如下:

success: function (data) {
    result = [data.d];
}

现在,我需要能够获取内部数据以将其呈现到购物车中

所以我需要能够按 ID 遍历项目并提取

id
qty
singlePrice

这样我就可以在浏览器中显示它,但我会睁一只眼闭一只眼地尝试解决它。​​

我尝试在 data.d 周围添加[,比如

var result = [data.d]

并尝试在结果中循环

result = [data.d];

    $(result).each(function (i, thing) {
         var thisOne = (result[i]);
         //alert(thing); //<< returns object object
         $(thisOne).each(function (j, val) {
              alert(thisOne + " - " + val.id); //<< both thisOne and val.id return object object
         });
     });

通过警报的返回,我清除了某种 JSON 对象,但我显然搞混了!

我不是程序员,但正在做一个让我慢慢发疯的项目!

【问题讨论】:

  • 只是一个快速的建议,调试时使用console.log( ... ) 而不是alert。您将获得有关正在发生的事情的更多信息,并且只要单击“确定”,它就不会消失。输出将在您的 DOM 检查器的控制台中(Firefox 中的 Firebug,Chrome/Safari/IE 中的开发人员工具。在任何浏览器中按 F12 以打开其 DOM 检查器。)

标签: jquery getjson json


【解决方案1】:

你应该这样做

var data = {
    "d": {
        "7907": {
            "id": "7907",
            "qty": "4",
            "singlePrice": "1185"
        },
        "2698": {
            "id": "2698",
            "qty": "1",
            "singlePrice": "1322"
        }
    }
}



var result = data.d;

$.each(result , function(ind, el) {
    //alert(thing); //<< returns object object
    alert(ind + " - " + el.id);
});

在这里摆弄http://jsfiddle.net/VHPQX/

【讨论】:

  • 外部.each() 是干什么用的?
【解决方案2】:
success: function (data) {
    var d = $.parseJSON(data.d);
    for(var i =0;i<d.length;i++)
    {     
        alert("Id is"+d[i].id);
    }
}

【讨论】:

    【解决方案3】:

    你需要使用jQuery的generic iterator $.each()而不是它的jQuery对象迭代器$().each()

    success: function (data) {
        $.each(data.d, function(k, val) {
           // "val" is the current item, so use its properties here, e.g.:
           var id = val.id,
               total = +val.qty * +val.singlePrice;
        });
    }
    

    (简单演示:http://jsfiddle.net/2vvfZ/

    请注意,当迭代对象的属性时,不能保证顺序(当我在 Chrome 中测试它时,它先是 2698 项,然后是 7907 项)。如果您需要确定顺序,请使用对象数组。

    【讨论】:

      【解决方案4】:

      你可以只使用 for..in 循环:

      for (key in data.d)
      {
          document.write(key + '<br>')
          document.write('<blockquote>')
          document.write('id: ' + data.d[key].id + '<br>')            
          document.write('qty: ' + data.d[key].qty + '<br>')            
          document.write('singlePrice: ' + data.d[key].singlePrice + '<br>')            
          document.write('</blockquote>')
      }
      

      结果:

      2698
          id: 2698
          qty: 1
          singlePrice: 1322
      7907
          id: 7907
          qty: 4
          singlePrice: 1185
      

      JSFiddle:http://jsfiddle.net/qnqWK/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多