Python根据编码数据返回JSON表示

时间:2017-06-09 23:15:39

标签: python json pandas flask

我使用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的字符串表示形式的实例也是如此。

似乎有时候我会对数据进行双重编码,但我无法解决可能发生这种情况的问题。

有什么建议吗?

1 个答案:

答案 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类型)的错误 - 这就是我在数据中发现问题的方法。