2010-02-13 63 views
58

我正在使用JS对象来创建带有Google可视化的图形。我正在设计数据源。起初,我创建了一个JS对象客户端。JSON字符串到JS对象

var JSONObject = { 
    cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
     {id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
    {c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}] 
}; 

var data = new google.visualization.DataTable(JSONObject, 0.5); 

现在我需要动态获取数据。所以,我送一个AJAX请求到返回的JSON字符串的页面:

"cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
{id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
{c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}" 

这是我保存到一个变量:

var var1 = "cols: [{i ....... 66}]}" 

并显示为

alert(var1); 

现在我的任务是从这个字符串创建一个JS对象。这不起作用。当我使用JS对象时,一切正常,我能够获得我所需的图形。现在,如果我尝试将从警报消息确认的AJAX请求中的字符串值放入n对象中,则该对象无法正确创建。请让我知道您的意见和任何更正或建议。

+1

使用javascript'eval(json_string)'方法将字符串转换为json对象。尽管如此,同样的功能可能会有潜在的危险,因为它也可以执行脚本。 – 2010-02-13 10:15:37

+1

只是一个FYI - 键名和字符串**必须**在有效的JSON里面'''':http://simonwillison.net/2006/Oct/11/json/ – gnarf 2010-02-13 10:16:42

+0

可能的重复[Serializing to JSON in jQuery](http://stackoverflow.com/questions/191881/serializing-to-json-in-jquery) – outis 2011-12-26 10:11:08

回答

118

一些现代的浏览器解析JSON成一个本地对象支持:

var var1 = '{"cols": [{"i" ....... 66}]}'; 
var result = JSON.parse(var1); 

对于不支持它的浏览器,你可以从json.org下载json2.js为安全解析JSON对象。该脚本将检查本机JSON支持,如果它不存在,请改为提供JSON全局对象。如果速度更快的本机对象可用,它将会退出脚本并保持原样。但是,您必须提供有效的JSON,否则会引发错误—,您可以使用http://jslint.comhttp://jsonlint.com检查JSON的有效性。

+4

相关:http://caniuse.com/json – JamesHalsall 2014-02-16 21:48:38

5

如果您信任字符串中的数据,则可以使用eval(jsonString),否则您需要正确解析它 - 请查看json.org以获取一些代码示例。

+1

我可以信任的内容一个大网站的API(Reddit)? – 2014-08-29 17:22:01

3

您可以使用JSON.org中的this library将您的字符串转换为JSON对象。

var var1_obj = JSON.parse(var1); 

或者你可以使用jquery-json库也是如此。

var var1_obj = $.toJSON(var1); 
5

您问题中的字符串不是有效的json字符串。从json.org website

JSON是建立在两个结构:

* A collection of name/value pairs. In various languages, this is 
    realized as an object, record, struct, dictionary, hash table, keyed list, or 
    associative array. 
* An ordered list of values. In most languages, this is realized as an 
    array, vector, list, or sequence. 

基本上是一个JSON字符串将始终为{或[开始。

然后,作为@Andy E和@Cryo说你可以用json2.js或其他库解析字符串。

恕我直言,你应该避免eval,因为它会任何JavaScript程序,所以你可能会在安全问题。

3

您要返回的字符串不是有效的JSON。对象中的名称需要引用,整个字符串需要放在{ … }中以形成一个对象。JSON也不能包含诸如new Date()之类的内容。 JSON只是JavaScript的一小部分,它只有字符串,数字,对象,数组,true,falsenull

查看JSON grammar了解更多信息。