如何将JSON对象转换为有用的东西?

时间:2012-05-29 00:38:46

标签: jquery json

这是我的JSON文件

"shipping":{
    "countries":{
        "150":{
            "id":150,
            "code":"nl",
            "title":"Nederland"
        }
    },
    "country":150,
    "zipcode":null,
    "methods":{
        "core|13490|40699":{
            "id":"core|13490|40699",
            "title":"ophalen",
            "description":"ophalen",
            "content":false,
            "pickup":true,
            "cod":false,
            "price":{
                "price_excl":"0.0000",
                "price_incl":"0.0000"
            }
    },
    "core|10292|40718":{
        "id":"core|10292|40718",
        "title":"Pakketdienst",
        "description":"Pakketdienst",
        "content":false,
        "pickup":false,
        "cod":false,
        "price":{
        "price_excl":"33.5714",
        "price_incl":"39.9500"}
        }
    }
}

我的脚本如下所示:

function bakVormShipping(targetClass){
    $.getJSON('http://shop.com/cart/?format=json', function(data){
        var methods = ''
        $.each(data.cart.shipping.methods, function(index, methods){
            if (index == "core|10292|40696") {
                $('<span></span>').html('<strong>' + methods.price.price_incl + '</strong>').appendTo(targetClass);
            }
            else if (index == "core|10292|40693") {
                $('<span></span>').html('<strong>' + methods.price.price_incl + '</strong>').appendTo(targetClass);
            }
            else if (index == "core|10292|40718") {
                $('<span></span>').html('<strong>' + methods.price.price_incl + '</strong>').appendTo(targetClass);
            }
        });
    });
}

首先解释一下。您看到的json是从“购物车”页面调用的。您看到的第一种方法是送货方式:在商店取货。实际发货的第二个。我想在我的商店的不同页面加载第二个(实际发货)。所以人们可以看到运费是多少。所有产品都是基于重量,所以当产品重量更大时,运费会改为id为“core | 10292 | 40693”和“core | 10292 | 40718”的方法(参见代码)并且所有价格都不同。所有这些都是动态的,因此json将始终具有拾取方法和实际的运输方法。

我努力实现的目标是 a)缩短代码。例如if(index ==“core | 10292 | 40696”||“core | 10292 | 40693”||“core | 10292 | 40718”)不起作用并打印出拾取方法和实际发货方法。

和b)将输出转换为带有两位小数的货币。我搜索了这个论坛,但我无法解决这个问题。该代码现在打印39.9500而不是39.95

c)我想摆脱$('<span></span>'),因为代码现在打印了一个范围内的所有内容。我尝试使用$(方法),但这会产生“未定义”错误。显然是因为var methods =是“空的”并且什么都不做。

有没有人有指示或愿意帮忙?我对JSON和jquery很陌生,所以请耐心等待。

1 个答案:

答案 0 :(得分:3)

  

a)if (index == "core|10292|40696" || "core|10292|40693" || "core|10292|40718")不起作用

如果index等于您需要执行此操作的任何值,请执行以下操作:

if (index == "core|10292|40696" || index == "core|10292|40693"
    || index == "core|10292|40718")
  

b)将输出转换为两位小数的货币。

目前您的货币金额是字符串。以下内容使用unary plus operatorprice_incl从字符串更改为数字,然后使用.toFixed() method将它们四舍五入到小数点后两位:

(+methods.price.price_incl).toFixed(2)

+methods.price.price_incl周围的括号是因为没有它们,对.toFixed(2)的方法调用会比一元加号具有更高的运算符优先级。

  

c)我想摆脱$('<span></span>'),因为代码现在打印了所有内容。

您可以像创建跨度一样创建强元素,即通过将一串html传递给$()函数(然后将结果附加到targetClass,就像您已经做):

$('<strong>' + methods.price.price_incl + '</strong>').appendTo(targetClass);

// OR, possibly easier to read but definitely more compact:
$('<strong/>').html(methods.price.price_incl).appendTo(targetClass);

// OR with the rounding included:
$('<strong/>').html((+methods.price.price_incl).toFixed(2)).appendTo(targetClass);