JSON响应{“d”:“128.00”}但显示“128”

时间:2010-04-15 16:46:04

标签: javascript jquery ajax json

我一直在使用购物车,用户可以随意添加/删除订单商品,并使用jQuery $ .ajax

通过网络服务返回更新的小计

以下是我如何调用网络服务并使用响应设置小计。

//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来设置正确的contentType:

$.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;
}

});

3 个答案:

答案 0 :(得分:2)

这是因为该值被视为一个数字,而您希望将其视为一个字符串。 当您使用'..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); 

答案 1 :(得分:1)

我没有在此代码中看到您访问响应的d属性的任何位置。

也许你的意思是这样做?

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

<击>

修改

好的,我看到了问题。您正在返回JSON,但未在$.ajax()调用中定义 dataType 。这意味着jQuery会看到您的application/json mimetype并将响应解释为JSON。 JSON中的128.00Number,而不是String。但是,"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>

和test.php

<?php

header( 'Content-type: application/json' );
echo '128.00';

输出

  

小计128

但是当我将 test.php 改为

<?php

header( 'Content-type: application/json' );
echo '"128.00"';

生成预期输出

  

小计128.00

或者,您也可以通过指定 dataType 参数告诉jQuery将响应视为文本,例如

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

编辑2

好的,在弄乱了这个之后,我看到发生了什么。您定义的 dataFilter 处理程序将响应转换为JSON本身,在这种情况下,返回字符串128.00但是,jQuery 仍然将智能猜测的dataType(即JSON)应用于此值,然后再将其发送给成功处理程序。

有很多方法可以解决这个问题,所有这些方法都取决于您的应用程序依赖于此设置的其他AJAX调用。我在测试中应用的快速修复是

$.ajaxSetup({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  data: "{}",
  // define the text data type so that we return data.d, jQuery doesn't parse it as JSON again
  dataType: 'text',
  dataFilter: function(data) {
      data = $.parseJSON( data ); // Use jQuery's parsing
      if (data.hasOwnProperty('d'))
      {
          return data.d;
      }else{
          return data;
      }
  }
});

但这可能无法全面适用于你

答案 2 :(得分:1)

请试试这个:

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

HTH