我使用json.dumps而不是flask.jsonify从Flask返回json内容类型,因为我正在使用一些定制的JSON编码来处理Pandas数据帧数据类型
view.py
def post(self)
....
header = {'Content-Type': "application/json"}
json_data = self.serialize_json(df, metadata)
return make_response(json_data, 200, header)
def serialize_json(self, df, metadata)
serialized = json.dumps({'classification': df.to_dict(orient='split'),
'metadata': metadata}, cls=JSONEncoder)
return serialized
encoder.py
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, np.integer):
return int(o)
if isinstance(o, np.floating):
return float(o)
if isinstance(o, np.ndarray):
return o.tolist()
客户端看到的响应标头始终包含:
Content-Type:application/json
然而我遇到的问题是,根据输入到serialize_json方法的数据帧,有时客户端响应数据包含数据的字符串表示,例如:
{ \"uid\" : \"1\", \"genus\": \"Felis\" }
而不是
{ "uid" : "1", "genus": "Felis" }
尝试在Python中添加dubug,记录json_data输出总是看起来像
{ "uid" : "1", "genus": "Felis" }
即使客户端看到JSON的字符串表示形式的实例也是如此。
似乎有时候我会对数据进行双重编码,但我无法解决可能发生这种情况的问题。
有什么建议吗?
答案 0 :(得分:0)
问题是由于我编码的Pandas DataFrame中有时存在的NaN值(输入数据不同)。
我用以下方法修正了问题:
df = df.fillna(0)
在serialize_json调用之前。
即使编码的json在服务器端看起来完全正常,客户端也无法将NaN类型作为有效的JSON处理。
注意在找到这个之前,我确实尝试使用以下方法在客户端上破解解决方案:
try {
testData = response.classification.data
this.analyzedData = response.data
}
catch(err) {
this.analyzedData = JSON.parse(response.data)
}
引发了无法识别字符(是NaN类型)的错误 - 这就是我在数据中发现问题的方法。