Javascript JSON响应{quot;d";:“128.00";}但显示;128“;

Javascript JSON响应{quot;d";:“128.00";}但显示;128“;,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我一直在开发一个购物车,用户可以随意添加/删除订单项目,并使用jQuery$.ajax通过Web服务返回更新的小计 下面是我如何调用Web服务并使用响应设置小计 //perform the ajax call $.ajax({ url: p, data: '{' + s + '}', success: function(sTotal) { //order was updated: set span to new sub-total $("#

我一直在开发一个购物车,用户可以随意添加/删除订单项目,并使用jQuery$.ajax通过Web服务返回更新的小计

下面是我如何调用Web服务并使用响应设置小计

//perform the ajax call
$.ajax({
    url: p,
    data: '{' + s + '}',
    success: function(sTotal) {
        //order was updated: set span to new sub-total
        $("#cartRow" + orderID).find(".subTotal").text(sTotal);
    },
    failure: function() {
        //if the orer was not saved

        //console.log('Error: Order not deleted');
    }
});
我得到的答复似乎很好:

{"d":"128.00"} 
当我在页面上显示总计时,它显示为128,而不是128.00

我完全相信这是一件非常简单和愚蠢的事情,但我现在深陷其中,我需要一个有新鲜头脑的人来帮助我

干杯:)

编辑

我还使用$.ajaxSetup设置正确的内容类型:

$.ajaxSetup({
type: "POST",
contentType: "application/json; charset=utf-8",
data: "{}",
dataFilter: function(data) {
    var msg;

    if (typeof (JSON) !== 'undefined' &&
    typeof (JSON.parse) === 'function')
        msg = JSON.parse(data);
    else
        msg = eval('(' + data + ')');

    if (msg.hasOwnProperty('d'))
        return msg.d;
    else
        return msg;
}
}))

我看不到此代码中的任何地方可以访问响应的
d
属性

//perform the ajax call
$.ajax({
    url: p,
    data: '{' + s + '}',
    success: function(sTotal) {
        //order was updated: set span to new sub-total
        $("#cartRow" + orderID).find(".subTotal").text(sTotal);
    },
    failure: function() {
        //if the orer was not saved

        //console.log('Error: Order not deleted');
    }
});
也许你是想这么做

$("#cartRow" + orderID).find(".subTotal").text(sTotal.d);
// --------------------------------------------------^^

编辑 好的,我明白问题所在了。在
$.ajax()
调用中,您返回的是JSON,但没有定义数据类型。这意味着jQuery会看到您的
应用程序/json
mimetype,并将响应解释为json128.00是一个,而不是一个。但是,
“128.00”
将是一个字符串

为了保持此功能正常工作,您需要在打印响应之前格式化响应(正如其他人所建议的),或者调整端点以返回有效的JSON字符串

这是我的测试来证明这个解决方案

<div id="test">
  Subtotal <span class="subTotal"></span>
</div>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript" charset="utf-8">
  google.load("jquery", "1.4.2");
</script>
<script type="text/javascript" charset="utf-8">

$.ajax({
  url: 'test.php',
  data: {},
  success: function(sTotal) {
    //order was updated: set span to new sub-total
    $("#test").find(".subTotal").text(sTotal);
  }
});

</script>
但这可能对您来说并不全面

我看不到在这段代码的任何地方可以访问响应的
d
属性

//perform the ajax call
$.ajax({
    url: p,
    data: '{' + s + '}',
    success: function(sTotal) {
        //order was updated: set span to new sub-total
        $("#cartRow" + orderID).find(".subTotal").text(sTotal);
    },
    failure: function() {
        //if the orer was not saved

        //console.log('Error: Order not deleted');
    }
});
也许你是想这么做

$("#cartRow" + orderID).find(".subTotal").text(sTotal.d);
// --------------------------------------------------^^

编辑 好的,我明白问题所在了。在
$.ajax()
调用中,您返回的是JSON,但没有定义数据类型。这意味着jQuery会看到您的
应用程序/json
mimetype,并将响应解释为json128.00是一个,而不是一个。但是,
“128.00”
将是一个字符串

为了保持此功能正常工作,您需要在打印响应之前格式化响应(正如其他人所建议的),或者调整端点以返回有效的JSON字符串

这是我的测试来证明这个解决方案

<div id="test">
  Subtotal <span class="subTotal"></span>
</div>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript" charset="utf-8">
  google.load("jquery", "1.4.2");
</script>
<script type="text/javascript" charset="utf-8">

$.ajax({
  url: 'test.php',
  data: {},
  success: function(sTotal) {
    //order was updated: set span to new sub-total
    $("#test").find(".subTotal").text(sTotal);
  }
});

</script>

但这可能对您来说并不全面,这是因为该值被视为一个数字,而您希望它被视为一个字符串。 当您使用“。text(sTotal)”,实际上是在包装原语sTotal的Number对象上调用.toString()方法。因为这是一个整数,所以它不带小数。 在调用.text(foo)之前,您需要使用一种将数字格式化为字符串的格式,以便将数字格式化为那样的格式

这将给你两个小数

var a=1/3; 
a = a.toString(); 
switch(a.lastIndexOf(".")){ 
    case -1: 
        a+=".00";
        break; 
    case a.length-2: 
        a+="0"; 
        break; 
    default: 
        a=a.substring(0, a.indexOf(".") + 3); 
} 
alert(a); 

这是因为该值被视为一个数字,而您希望它被视为一个字符串。 当您使用“。text(sTotal)”,实际上是在包装原语sTotal的Number对象上调用.toString()方法。因为这是一个整数,所以它不带小数。 在调用.text(foo)之前,您需要使用一种将数字格式化为字符串的格式,以便将数字格式化为那样的格式

这将给你两个小数

var a=1/3; 
a = a.toString(); 
switch(a.lastIndexOf(".")){ 
    case -1: 
        a+=".00";
        break; 
    case a.length-2: 
        a+="0"; 
        break; 
    default: 
        a=a.substring(0, a.indexOf(".") + 3); 
} 
alert(a); 
请试试这个:

 $("#cartRow" + orderID).find(".subTotal").text(sTotal.toFixed(2));
HTH

请尝试以下操作:

 $("#cartRow" + orderID).find(".subTotal").text(sTotal.toFixed(2));

HTH

'd'由ASP.NET AJAX用于包装返回值。抱歉,忘了提及我正在使用ASP.NET AJAX!嘿,谢谢你的帮助。我更新了上面的queston,以显示如何使用jQuery.ajaxSetup()设置正确的内容类型。我必须承认,我有点迷路了ASP.NET AJAX使用d'来包装返回值。抱歉,忘了提及我正在使用ASP.NET AJAX!嘿,谢谢你的帮助。我更新了上面的queston,以显示如何使用jQuery.ajaxSetup()设置正确的内容类型。我必须承认,我有点迷路了!你能给我举个例子吗?我假设它不仅仅是:var totalString=msg.toString()$(“#cartRow”+orderID).find(“.subTotal”).text(totalString);这将给你两个小数,你能给我举个例子吗?我假设它不仅仅是:var totalString=msg.toString()$(“#cartRow”+orderID).find(“.subTotal”).text(totalString);这将给你两个小数,这是wierd…我在JSFiddle中尝试过它,它工作得非常好。通过其他事件将值加载到.subTotal时,请检查是否正在执行parseInt或parseFloat。原来是这样!哇,谢谢你,伙计。我们说话的时候,我松了一口气……真是不可思议……我在JSFIDLE中试用过,效果非常好。通过其他事件将值加载到.subTotal时,请检查是否正在执行parseInt或parseFloat。原来是这样!哇,谢谢你,伙计。我们说话时,我松了一口气。。