Javascript &引用;无效的JSON字符串";在Google可视化API示例中

Javascript &引用;无效的JSON字符串";在Google可视化API示例中,javascript,django,json,google-visualization,Javascript,Django,Json,Google Visualization,我大致上是这样的。但一定是在做傻事 服务器端Django视图代码: data_table = gviz_api.DataTable(description) data_table.LoadData(data) json = data_table.ToJSon() return json 这些是从pydev调试器复制粘贴的变量的值:(我对每个描述字段类型使用字符串只是为了测试) 说明: [("sensor","string", "Sensor name"), ("timestamp","st

我大致上是这样的。但一定是在做傻事

服务器端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")]
数据:

json(由google api生成):

接收json的客户端javascript代码:

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对象时导致以下错误(第二行):


我知道整个线索是确保模式格式与数据格式匹配,但事实似乎是这样。它必须很简单。

JSON解析器应该要求字段名用双引号分隔,如规范中所述:

对象是无序的集合 零个或多个名称/值对, 如果名称是字符串[…],则字符串以引号开头和结尾

因此,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" 
                } 
            ] 
        } 
    ]
}

不幸的是,我不能发表评论,所以这并不是一个完整的答案,但是在尝试将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字符串?

也有同样的问题,即使在将选项剥离到空字典时也是如此(导致错误“无效json字符串:{}”)。事实证明,问题出在脚本src CSP上,记录如下:


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

请确保将脚本源的
'safe-eval'
放在
内容安全策略中

我用于谷歌地图和谷歌图表的策略:

<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;
  "
/>


“JSON解析器可能希望您的JSON字段名被引用”,也就是说,JSON解析器可能希望数据被引用,属性名被引用。谢谢您的回答。但是,请注意,json是由GoogleAPI生成的,而不是由我生成的。我只是以python列表的形式提供模式和数据,GoogleVizAPI执行序列化。我的输出与示例中的输出类似(请参阅问题和源代码中的链接),因此我假设不需要对json进行后期处理来添加引号。原来有一个问题是关于这个:FWIW,问题已经解决了:有相同的问题和评估工作。谷歌应该改变它,这样我们就可以直接将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" 
                } 
            ] 
        } 
    ]
}
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});
<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;
  "
/>