簡體   English   中英

如何將JSON響應轉換為Python列表

[英]How to convert json response into Python list

我得到的JSON響應requests.get

req = requests.get(SAMPLE_SCHEDULE_API)

並將其轉換成字典

data = json.loads(req.text)["data"]

當我嘗試將字符串轉換為Python dict時,

我收到ValueError: malformed node or string:

ast.literal_eval(data)

我不知道該怎么做。

代碼段

    def schedules(cls, start_date=None, end_date=None):
        import ast
        req = requests.get(SAMPLE_SCHEDULE_API)
        data = json.loads(req.text)["data"]
        ast.literal_eval(data)
        return pd.DataFrame(json.loads(req.text)["data"])

JSON回應

{
status: "ok",
version: "v1",
data: "[
{"_id":"2015-01-28","end_date":"2015-01-28","estimated_release":1422453600000,"is_projection":false,"is_statement":true,"material_link":null,"start_date":"2015-01-27"},
{"_id":"2015-03-18","end_date":"2015-03-18","estimated_release":1426687200000,"is_projection":false,"is_statement":false,"material_link":null,"start_date":"2015-03-17"},
{"_id":"2015-04-29","end_date":"2015-04-29","estimated_release":1430316000000,"is_projection":false,"is_statement":false,"material_link":null,"start_date":"2015-04-28"},
{"_id":"2015-06-17","end_date":"2015-06-17","estimated_release":1434549600000,"is_projection":false,"is_statement":false,"material_link":null,"start_date":"2015-06-16"},
{"_id":"2015-07-29","end_date":"2015-07-29","estimated_release":1438178400000,"is_projection":false,"is_statement":false,"material_link":null,"start_date":"2015-07-28"}]"
}

詳細錯誤消息

Traceback (most recent call last):
  File "fomc.py", line 25, in <module>
    schedules = FOMC.schedules()
  File "fomc.py", line 21, in schedules
    ast.literal_eval(data)
  File "/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/ast.py", line 86, in literal_eval
    return _convert(node_or_string)
  File "/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/ast.py", line 58, in _convert
    return list(map(_convert, node.elts))
  File "/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/ast.py", line 63, in _convert
    in zip(node.keys, node.values))
  File "/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/ast.py", line 62, in <genexpr>
    return dict((_convert(k), _convert(v)) for k, v
  File "/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/ast.py", line 85, in _convert
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Name object at 0x10a19c990> 

您已經對data兩次編碼(完全沒有必要)。 您只需要使用json.loads再次解碼data

def schedules(cls, start_date=None, end_date=None):
    req = requests.get(SAMPLE_SCHEDULE_API)
    data_json = json.loads(req.text)["data"]
    data = json.loads(data_json)
    return pd.DataFrame(data)

請注意, ast.literal_eval用於Python代碼,而json.loads用於JSON,緊跟JavaScript代碼; 例如,差異為truefalsenullTrueFalseNone 前者是JSON中使用的javascript語法(因此您將需要json.loads ;后者是Python代碼,您將使用ast.literal_eval

字段“數據”是字符串,而不是列表。 該字符串的內容似乎也為JSON,因此出於某種原因將JSON封裝在JSON中。 如果可以,請解決此問題,以便僅編碼一次為JSON。 如果這不起作用,則可以檢索該字段並分別對其進行解碼。

由於響應已經是json格式,因此您無需對其進行編碼。 這樣的方法

req = requests.get(SAMPLE_SCHEDULE_API)
data_str = req.json().get('data')
json_data = json.loads(data_str)

json()方法將返回響應的json編碼內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM