78

我正在使用 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);

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

 "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 请求中的相同字符串值放入对象中,则该对象没有正确创建。请让我知道您的意见和任何更正或建议。

4

5 回答 5

138

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

于 2010-02-13T09:58:33.903 回答
5

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

于 2010-02-13T09:55:50.100 回答
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 程序,因此您可能会遇到安全问题。

于 2010-02-13T10:19:12.497 回答
4

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

var var1_obj = JSON.parse(var1);

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

var var1_obj = $.toJSON(var1);
于 2010-02-13T09:56:09.883 回答
3

您返回的字符串不是有效的 JSON。需要引用对象中的名称,并且需要放入整个字符串{ … }以形成对象。JSON 也不能包含类似new Date(). JSON 只是 JavaScript 的一个小子集,它只有字符串、数字、对象、true数组falsenull.

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

于 2010-02-13T10:19:21.110 回答