一般而言jq的getJson回调不执行除了请求本身就出错之外那肯定就是json格式本身有问题了
最近在做一个demo,使用python的flask框架进行构建,route代码如下:
>run.py
@app.route('/data/getHotWordContent')
def getHotWordContent():
hot_word = request.args.get('hot_word')
return api.getHotWordContent(hot_word=hot_word)
>api.py
from flask import jsonfy
def getHotWordContent(self, hot_word='', start_date='2019-07-31', end_date='2019-08-14'):
wf = Wordfrequency(start_date=start_date, end_date=end_date)
json_data = []
data = wf.findHotWordContent(hot_word=hot_word)
for d in data:
json_data.append({'author': d[0], 'content': d[1]})
return jsonify({'data': json_data})
调用的js代码如下
var loadHotWordContent = function (hot_word) {
console.log('Loading hot word information ...')
$.getJSON({
url: pre_url + '/data/getHotWordContent',
data: {'hot_word': hot_word},
function(data) {
console.log('Json data load successfully!')
}
})
}
很诡异的是我在控制台的network中查看请求已经成功,而且使用的是flask本身的jsonfy工具,json肯定不会有格式问题,依然无法调用回调函数,经过一上午的研究终于发现了问题。
查找json的官方文档有
传入格式有误的 JSON 字符串可能导致抛出异常。例如,下面这些无效的 JSON 字符串:
{test: 1} (test 没有使用双引号包裹).
{'test': 1} ('test' 用了单引号而不是双引号包裹).
"{test: 1}" (test 没有使用双引号包裹).
"{'test': 1}" ('test' 用了单引号而不是双引号包裹).
"'test'" ('test' 用单引号代替双引号).
".1" (number 必须以数字开头; "0.1" 将是有效的).
"undefined" (undefined 不能表示一个 JSON 字符串; 然而null,可以).
"NaN" (NaN 不能表示一个 JSON 字符串; 用Infinity直接表示无限也是不允许的).
在flask中,如果遇到None值会直接格式化成为NaN从而触发这个bug
将None值替换即可解决问题