【问题标题】:Python returns JSON representation depending on encoded dataPython 根据编码数据返回 JSON 表示
【发布时间】:2023-03-21 06:39:01
【问题描述】:

我使用 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

编码器.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 中进行调试,记录 json_data 输出总是看起来像

{ "uid" : "1", "genus": "Felis" }

即使对于客户端看到 JSON 的字符串表示的实例也是如此。

似乎有时我会对数据进行双重编码,但我不知道这可能发生在哪里。

有什么建议吗?

【问题讨论】:

  • 您的代码的某些相关部分似乎丢失了,例如serialize_json 中的return。大部分输出也丢失了。
  • { \"uid\" : \"1\", \"genus\": \"Felis\" } 的返回类型是什么?是字符串吗?
  • @ChihebNexus 是从 javascript 检查 json 'object' 类型是:type:[object String] 但在它工作的情况下 type:[object Object]

标签: python json pandas flask


【解决方案1】:

问题是由于我正在编码的 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 类型)的错误 - 这就是我在数据中发现问题的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2012-03-04
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多