Flask中的多个Json响应转换为Pandas DataFrame

问题描述 投票:0回答:1

我有一个来自Flask Rest API的JSON结构。根据我们查询的资产数量,它不止一个JSON,我无法将其转换为Pandas数据帧。

from flask import Flask
import requests
import pandas as pd
import json

url = "http://localhost:5000/getpqdata"
random_cols = ['AAPL', 'MSFT']
JsonOutput = {'Assets': random_cols}

headers = {'Content-type': 'application/json'}
response = requests.post(url, json=JsonOutput, headers=headers)

rawdata = response.text

rawdata如下:

rawdata = '''[{"APPL": 1.067638}, {"AAPL": -1.996081}]
        [{"MSFT": 0.086638}, {"MSFT": -0.926081}]'''

data = json.loads(rawdata)

df = pd.DataFrame(data)
print(df)

它给出了以下错误。

C:\Python36>python D:\Python\pyarrow\RestfulAPI\test.py
Traceback (most recent call last):
File "D:\Python\pyarrow\RestfulAPI\test.py", line 36, in <module>
data = json.loads(rawdata)
File "C:\Python36\lib\json\__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "C:\Python36\lib\json\decoder.py", line 342, in decode
raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 2 column 13 (char 54)
python json pandas rest flask
1个回答
0
投票

您遇到的问题与pandas没有任何关系,而是与JSON解码有关。 json.loads(...)只支持一个JSON对象。你的rawdata里面有2个JSON对象。因此,当它到达第二行时,它会告诉您有额外的数据。您可以在this答案中看到可能的解决方案。

简而言之,你可以这样做:

def parse_json_stream(stream):
    decoder = json.JSONDecoder()
    while stream:
        obj, idx = decoder.raw_decode(stream)
        yield obj
        stream = stream[idx:].lstrip()

parsed_data = list(parse_json_stream(rawdata))
print(parsed_data)

[[{'APPL': 1.067638}, {'AAPL': -1.996081}], [{'MSFT': 0.086638}, {'MSFT': -0.926081}]]

至于将其转换为DataFrame,取决于您希望如何组织数据。

© www.soinside.com 2019 - 2024. All rights reserved.