2011-05-15 47 views
3

我大致跟在this example后面。但必须做一些愚蠢的......谷歌可视化API示例中的“JSON字符串无效”

服务器端的Django视图代码:

data_table = gviz_api.DataTable(description) 
data_table.LoadData(data) 
json = data_table.ToJSon() 
return json 

这些都是从PyDev调试变量的值复制粘贴:(使用字符串对每个描述域林

[("sensor","string", "Sensor name"), 
("timestamp","string", "Time"), 
("value","string", "Sensor value")] 

数据:

只是用于测试)

描述键入

[['testsensor', '2011-05-09 16:06:43.936000', '22.0'], 
['testsensor', '2011-05-09 16:56:23.367000', '23.0']] 

JSON(由谷歌API生成):

var json_table = new google.visualization.Table(document.getElementById('dataview')); 
var json_data = new google.visualization.DataTable(data, 0.6); 
json_table.draw(json_data, {showRowNumber: true}); 

这导致对构建DataTable对象下面的错误(第二行:

{cols:[{id:'sensor',label:'Sensor name',type:'string'},{id:'timestamp',label:'Time',type:'string'},{id:'value',label:'Sensor value',type:'string'}],rows:[{c:[{v:'testsensor'},{v:'2011-05-09 16:06:43.936000'},{v:'22.0'}]},{c:[{v:'testsensor'},{v:'2011-05-09 16:56:23.367000'},{v:'23.0'}]}]} 

JavaScript代码接收JSON客户端侧):

Uncaught Error: Invalid JSON string: {cols:[{id:'sensor',label:'Sensor name',type:'string'},{id:'timestamp',label:'Time',type:'string'},{id:'value',label:'Sensor value',type:'string'}],rows:[{c:[{v:'testsensor'},{v:'2011-05-09 16:06:43.936000'},{v:'22.0'}]},{c:[{v:'testsensor'},{v:'2011-05-09 16:56:23.367000'},{v:'23.0'}]}]} 
in default,table.I.js:152 

我明白,整个线索是确保th在模式格式匹配数据格式,但这似乎是这种情况。这一定很简单。

回答

3

可惜我不能评论,所以这是不完全是一个完整的答案,但你能尝试尝试之前eval'ing的JSON将它用于图表?

var json_table = new google.visualization.Table(document.getElementById('dataview')); 
var evalledData = eval("("+data+")"); 
var json_data = new google.visualization.DataTable(evalledData, 0.6); 
json_table.draw(json_data, {showRowNumber: true}); 

我认为这可能为我解决了这个问题,它可能不是最安全的方法,但你至少可以尝试它进行测试。

或者,也许玩simplejson从python转储您的json字符串,而不是只返回gviz字符串?

+0

eval技巧的作品,谢谢你。结果发现一个问题:http://code.google.com/p/google-visualization-python/issues/detail?id=4 – dgorissen 2011-05-19 10:49:35

+0

FWIW,问题已得到解决:http://code.google .com/p/google-visualization-python/source/detail?r = 16 – Leo 2012-07-06 12:57:07

+0

有同样的问题和eval的作品。 Google应该改变它,以便我们可以直接将JSON传递给DataTable .... – 2012-07-26 10:00:38

2

JSON解析器应该要求的字段名称以由双引号分隔,如在本说明书JSON RFC 4627概述:

一个目的是无序集合的零个或多个名称/值对 , 其中名称是一个字符串[...]一个字符串以引号开头和结尾。

因此,JSON格式应是这样的:

{ 
    "cols": [ 
     { 
      "id": "sensor", 
      "label": "Sensor name", 
      "type": "string" 
     }, 
     { 
      "id": "timestamp", 
      "label": "Time", 
      "type": "string" 
     }, 
     { 
      "id": "value", 
      "label": "Sensor value", 
      "type": "string" 
     } 
    ], 
    "rows": [ 
     { 
      "c": [ 
       { 
        "v": "testsensor" 
       }, 
       { 
        "v": "2011-05-09 16: 06: 43.936000" 
       }, 
       { 
        "v": "22.0" 
       } 
      ] 
     }, 
     { 
      "c": [ 
       { 
        "v": "testsensor" 
       }, 
       { 
        "v": "2011-05-09 16: 56: 23.367000" 
       }, 
       { 
        "v": "23.0" 
       } 
      ] 
     } 
    ] 
} 
+1

*“的JSON解析器可能希望你的JSON字段名被引用”的数据*这是说,JSON解析器可以期待是** [有效的JSON](http://jsonlint.org)**,其中的属性名称* [必须](http://json.org)*引用。 – 2011-05-15 08:57:30

+0

感谢您的回答。不过请注意,json是由google API生成的,而不是由我生成的。我只是提供模式和数据作为python列表,谷歌viz api执行序列化。我的输出与示例中的类似(请参阅http://google-visualization.appspot.com/python/static_example的问题和源代码中的链接),所以我假设我不应该需要后处理json才能添加引号。 – dgorissen 2011-05-16 10:25:16

0

即使将选项剥离到空字典(导致错误“无效的JSON字符串:{}”...),也有同样的问题。原来的问题是脚本-Src CSP,记录在这里:https://github.com/keen/keen-js/issues/394

“解决方案”是向CSP添加不安全评估。

2

确保您将'unsafe-eval'用于脚本源Content-Security-Policy

我使用谷歌地图和谷歌图表策略:

<meta 
    http-equiv="Content-Security-Policy" 
    content=" 
    default-src 'self'; 
    script-src 'self' 'unsafe-inline' 'unsafe-eval' maps.googleapis.com www.google.com www.google-analytics.com; 
    img-src 'self' csi.gstatic.com www.google-analytics.com maps.gstatic.com maps.googleapis.com; 
    style-src 'self' 'unsafe-inline' www.google.com fonts.googleapis.com ajax.googleapis.com; 
    font-src 'self' fonts.gstatic.com; 
    " 
/>