【问题标题】:"Invalid JSON string" in Google visualization API exampleGoogle 可视化 API 示例中的“无效 JSON 字符串”
【发布时间】:2011-08-25 19:54:11
【问题描述】:

我大致关注this example。但一定是在做傻事……

服务端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(由google api生成):

{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的客户端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 对象时出现以下错误(第二行):

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

我知道整个线索是确保架构格式与数据格式匹配,但情况似乎如此。一定很简单。

【问题讨论】:

    标签: javascript django json google-visualization


    【解决方案1】:

    确保将 'unsafe-eval' 用于Content-Security-Policy 中的脚本源。

    我用于 Google 地图和 Google 图表的政策:

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

    【讨论】:

    • 那是帮助我解决这个问题的小金块..
    【解决方案2】:

    很遗憾,我无法发表评论,所以这不是一个完整的答案,但您可以在尝试将 JSON 用于图表之前尝试评估 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 字符串?

    【讨论】:

    【解决方案3】:

    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" 
                    } 
                ] 
            } 
        ]
    }
    

    【讨论】:

    • "JSON 解析器可能期望你的 JSON 字段名被引用" 也就是说,JSON 解析器可能期望数据是 valid JSON,其中引用了属性名称must be
    • 感谢您的回答。但是,请注意,json 是由 google API 生成的,而不是由我生成的。我只是提供模式和数据作为 python 列表,谷歌 viz api 执行序列化。我的输出类似于示例中的输出(请参阅问题中的链接和google-visualization.appspot.com/python/static_example 的来源),所以我认为我不需要对 json 进行后处理以添加引号。
    【解决方案4】:

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

    “解决方案”是在 CSP 中添加 unsafe-eval。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 2010-11-21
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      相关资源
      最近更新 更多