2011-04-29 24 views
2


是否有解析Json时指定类型的方法,以便转换自动发生。Jquery:解析JSON期间自动类型转换

所以我有jsonData,并且x和y值需要是数字。所以,我可以考虑的唯一方法是循环和转换每个。任何更好的逻辑,或有效的方式?

var jsonData = '[{"x:"1", "y":"2"}, {"x:"3", "y":"4"}]' 
var needed = [{x:1, y:2}, {x:3, y:4}] 
var vals = $.parseJSON(jsonData); 
// 
var Coord = function(x, y){ 
this.x = x; 
this.y = y; 
} 
var result = []; 
function convert(vals) { 
for (var i=0,l=vals.length; i<l; i++) { 
     var d = vals[i]; 
     result.push(new Coord(Number(d.x), Number(d.y))); 
    }; 
} 
+0

您是否使用ajax检索json? – mekwall 2011-04-29 16:56:29

回答

10

jsonData变量中的JSON无效。只有属性应该位于双引号内。只要您将数据转换为JSON,请使用解析器(explained on json.org),而不要手动编写。您可以随时使用诸如JSONLint之类的工具来检查JSON是否有效。

任何数字(整数,小数,浮点数)都是有效的JSON数据类型,不必用双引号封装。

这是有效的JSON:[{"x": 1, "y": 2}, {"x": 3, "y": 4}]

但是,如果你没有在源控制和使用Ajax检索JSON,你可以提供一个回调函数来dataFilter选项。如果您使用的是jQuery 1.5,那么也有converters这是广义dataFilter回调

我怀疑x和y坐标可能是十进制数,这就是为什么我在下面的例子中选择使用parseFloat而不是parseInt

使用dataFilter回调函数实施例(预jQuery的1.5):使用

$.ajax({ 
    url: "/foo/", 
    dataFilter: function(data, type){ 
     if (type == "json") { 
      var json = $.parseJSON(data); 
      $.each(json, function(i,o){ 
       if (o.x) { 
        json[i].x = parseFloat(o.x); 
       } 
       if (o.y) { 
        json[i].y = parseFloat(o.y); 
       } 
      }); 
     } 
     return data; 
    }, 
    success: function(data){ 
     // data should now have x and y as float numbers 
    } 
}); 

实施例一converter(jQuery的1.5或更高版本):

$.ajaxSetup({ 
    converters: { 
     "json jsoncoords": function(data) { 
      if (valid(data)) { 
       $.each(data, function(i,o){ 
        if (o.x) { 
         data[i].x = parseFloat(o.x); 
        } 
        if (o.y) { 
         data[i].y = parseFloat(o.y); 
        } 
       }); 
       return data; 
      } else { 
       throw exceptionObject; 
      } 
     } 
    } 
}); 

$.ajax({ 
    url: "/foo/", 
    dataType: "jsoncoords" 
}).success(function(data){ 
    // data should now have x and y as float numbers 
}); 
+0

谢谢你的详细解答..我最终可能会使用ajax ..再次感谢 – bsr 2011-04-29 17:23:31

+0

@bsreekanth,我很高兴能有所帮助!如果你不使用Ajax,我希望你能够加入上面的代码来获得所需的结果。快乐的沃尔普吉斯之夜! – mekwall 2011-04-29 17:25:54

1

的唯一方式是遍历你JSON数据,你会发现该字符串转换成使用parseInt("2");号码。

0

如果有JSON源你的控制可以从坐标中删除引号。

根据json.org,值可以是sting,number,object,array,true,false或null。字符串被识别为包含在双引号中的字符序列。引号中未包含的数字值应作为数字进行处理。您可以使用正在使用的解析器引擎进行验证。

如果你只是消费json,datafilter和转换器方法,那么已经提到,这将是解决任务最棘手的方法。

+0

好吧,我使用jQuery,并根据http://api.jquery.com/jQuery.parseJSON/我需要有“”..谢谢 – bsr 2011-04-29 17:40:06

+0

@bsreekanth,你只需要双引号的属性,而不是值。 '[{“x”:35.21423,“y”:14.32543}]是有效的JSON。你总是可以使用[JSONLint](http://jsonlint.com/)来检查:) – mekwall 2011-04-29 17:52:46

+0

这是正确的json,它在jquery中正确解析。在萤火虫快速测试证明它。 >>> $ .parseJSON('{“test”:1.23}'); 结果:Object {test = 1.23}听起来像jquery文档是错误的。 – Rob 2011-04-29 19:32:49

1

我有同样的问题。在一行代码中,我删除紧接在数字之前或之后或减号之前的任何引号。

var chartData = $.parseJSON(rawData.replace(/"(-?\d)/g, "$1").replace(/(\d)"/g, "$1"));

在我来说,它是通过AJAX从中我能控制的PHP代码来了,后来我才知道,我可以简单地使用JSON_NUMERIC_CHECK - 见PHP json_encode encoding numbers as strings

这些解决方案将任何看起来像数字的东西都转换成数字。因此,如果您可以拥有类似数字的内容,但需要将其视为字符串,则需要根据数据确定其他内容。

+0

+1被推荐为最后一个资源。在我的例子中,我使用了这个正则表达式:'$ .parseJSON(rawData.replace(/“( - ?[\ d] + \。?[\ d] +)”/ g,“$ 1”)'像“80FF00”这些被视为数字。 – lepe 2016-02-03 06:54:01