我有以下代码:
$.ajax({
async: false,
url: 'chart_data.php',
data: {'option':'high', 'id':id},
dataType: 'json',
success: function(response){
alert('in');
var data = google.visualization.arrayToDataTable(response);
var options= { curveType:'none', width: 300, height: 200, hAxis: {title:'Years'}, vAxis: {title:'Value'}, title: 'High Time - Low Value' };
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
});
在网页中。我想根据下拉菜单显示图表。功能的其余部分工作得很好。我检查了Firebug,JSON响应通过200 OK状态消息传来。事实上,我可以在Firebug中看到所有的JSON。
问题仍然存在,为什么alert('in');
永远不会被触发,为什么谷歌不会将它的图表加载到关联的图表div中?
编辑:
添加错误回调时出现以下错误: parseerror SyntaxError:JSON.parse:意外字符。
这是来自服务器的JSON响应:
[['Year', 'Low', 'High'],['1984', 318000, 395000],['1984', 418000, 495000],
['1984', 380000, 450000],['1984', 410000, 460000],['1984', 410000, 460000],
['1985', 435000, 485000],['1985', 435000, 485000],['1985', 435000, 485000],
['1985', 435000, 485000],['1985', 435000, 485000],['1985', 435000, 485000],
['1985', 435000, 485000],['1985', 435000, 485000],['1985', 318000, 395000],
['1985', 418000, 495000],['1985', 380000, 450000],['1985', 420000, 470000],
['1985', 420000, 470000]]
虽然我对JSON结构并不是100%肯定,但对我来说看起来是正确的。
我做了一些改动,似乎我进一步了解。首先,我从PHP脚本中删除了header('Content-type: application/json');
行。然后我将dataType: 'json'
更改为dataType: 'html'
。
现在加载$ .ajax()调用中的成功回调。当我尝试将其发送到Google的arrayToDataTable()方法时,它不喜欢文本响应。
如果我可以将返回的字符串(看起来像上面的JSON响应,实际上不是JSON响应)解析为javascript数组,那么我就是金色的。我希望。
我最终在成功回调中使用eval语句将http响应转换为数组eval('var res = ' + response);
这可能不是最好的方法。如果某人有更好(更安全)的方式,那就太好了。
我真的不喜欢使用eval语句,因此我研究了将返回字符串更改为数组的其他方法。在我遇到这个小宝石之前,我并不关心它们中的任何一个:
response = JSON.parse(response);
这没有问题。
感谢大家的帮助。
答案 0 :(得分:1)
好的还没有人回答,所以我会在这里试一试。您似乎已更新了错误消息以及从ajax调用获得的返回值。
问题是你收到的不是JSON对象,而是javascript数组。 JSON对象将用大括号{和}封装,而数组则用方括号[和]包围。
您应该通过ajax修改您正在调用的脚本,以便它返回一个正确的JSON对象(在php中使用json_encode非常方便)。
您希望您的回复看起来更像这样:
{"data":[["Year", "Low", "High"],["1984", 318000, 395000],["1984", 418000, 495000],
["1984", 380000, 450000],["1984", 410000, 460000],["1984", 410000, 460000],
["1985", 435000, 485000],["1985", 435000, 485000],["1985", 435000, 485000],
["1985", 435000, 485000],["1985", 435000, 485000],["1985", 435000, 485000],
["1985", 435000, 485000],["1985", 435000, 485000],["1985", 318000, 395000],
["1985", 418000, 495000],["1985", 380000, 450000],["1985", 420000, 470000],
["1985", 420000, 470000]]}
根据google,他们正在寻找类似的东西:
{
cols: [{id: 'task', label: 'Task', type: 'string'},
{id: 'hours', label: 'Hours per Day', type: 'number'}
],
rows: [{c:[{v: 'Work'}, {v: 11}]},
{c:[{v: 'Eat'}, {v: 2}]},
{c:[{v: 'Commute'}, {v: 2}]},
{c:[{v: 'Watch TV'}, {v:2}]},
{c:[{v: 'Sleep'}, {v:7, f:'7.000'}]}
]
}
那么,您是否真的需要重新编写数据以首先遵循此结构?像这样:
{
"cols": [{"id":"year", "label":"Year", "type":"string"},
{"id":"low", "label":"Low", "type":"string"},
{"id":"high", "label":"High", "type":"string"}],
"rows": [{"c":[{"v":"1984"}, {"v":"318000"}, {"v":"395000"}]},
{"c":[{"v":"1984"}, {"v":"418000"}, {"v":"495000"}]},
{"c":[{"v":"1984"}, {"v":"380000"}, {"v":"450000"}]},
{"c":[{"v":"1985"}, {"v":"420000"}, {"v":"470000"}]}]
}
如果JSON看起来有点令人困惑,你可以在这里阅读更多相关内容:http://www.json.org/
修改强>
考虑到我忽略了.arrayToDataTable()函数调用,我想我应该从Google的文档引用这个例子(链接已在上面引用):
// Version 1: arrayToDataTable method
var data2 = google.visualization.arrayToDataTable([
['Country', 'Population', 'Area'],
['CN', 1324, 9640821],
['IN', 1133, 3287263],
['US', 304, 9629091],
['ID', 232, 1904569],
['BR', 187, 8514877]
]);
由于您的阵列是这样的:
[['Year', 'Low', 'High'],
['1984', 318000, 395000],
['1984', 418000, 495000],
['1984', 380000, 450000],
['1984', 410000, 460000],
['1984', 410000, 460000],
['1985', 435000, 485000],
['1985', 435000, 485000],
['1985', 435000, 485000],
['1985', 435000, 485000],
['1985', 435000, 485000],
['1985', 435000, 485000],
['1985', 435000, 485000],
['1985', 435000, 485000],
['1985', 318000, 395000],
['1985', 418000, 495000],
['1985', 380000, 450000],
['1985', 420000, 470000],
['1985', 420000, 470000]]
似乎格式正确,我认为您应该尝试将ajax调用中的“dataType”更改为“text”而不是“json”,因为您实际上是在返回数组而不是JSON对象。这应该可以解决你的问题。
答案 1 :(得分:1)
您的JSON格式存在错误,字符串必须是双引号(“)而不是单引号(')
如果您想检查JSOn是否有效,可以使用this