JSON字符串转换为JS对象


75

我正在使用JS对象通过Google可视化创建图形。我正在尝试设计数据源。首先,我创建了一个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请求的相同字符串值放入对象中,则无法正确创建该对象。请让我知道您的意见以及任何更正或建议。


1
使用javascripteval(json_string)方法将字符串获取到json对象。但是请注意,同一功能可能也很危险,因为它也可以执行脚本。
Buhake Sindi

1
仅供参考-键名和字符串必须"在有效JSON的内部:simonwillison.net/2006/Oct/11/json
gnarf 2010年


Answers:


137

一些现代的浏览器支持将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的有效性。


5

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


1
我可以信任大型网站的API(Reddit)中的内容吗?

5

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

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程序,因此您可能会遇到安全问题。


4

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

var var1_obj = JSON.parse(var1);

或者,您也可以使用jquery-json库。

var var1_obj = $.toJSON(var1);

3

您返回的字符串不是有效的JSON。对象中的名称需要加引号,并且整个字符串都需要放入{ … }以形成对象。JSON也不能包含类似的内容new Date()。JSON是JavaScript的只是一小部分具有唯一字符串,数字,对象,数组truefalsenull

有关更多信息,请参见JSON语法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.