Проблема с разбором JSON MSG - PullRequest
0 голосов
/ 23 декабря 2018

Я вызываю API-интерфейс QUANDL для данных и возвращаю сообщение в формате JSON, которое у меня возникло при анализе перед отправкой в ​​базу данных.Мой код синтаксического анализа явно не правильно читает JSON.

С помощью приведенного ниже кода я получаю следующее (сокращено для простоты) JSON: {"datatable": {"data": [["AAPL","MRY", "2018-09-29", 265595000000], [ "AAPL", "MRY", "2017-09-30", 229234000000], [ "AAPL", "MRY", "2016-09-24»215639000000], [ "AAPL", "MRY", "2015-09-26", 233715000000], [ "AAPL", "MRY", "2014-09-27", 182795000000], [ "AAPL","MRY", "2013-09-28", 170910000000], [ "AAPL", "МРТ", "2018-09-29", 265595000000], [ "AAPL", "МРТ", "2018-06-30»255274000000], [ "AAPL", "МРТ", "2018-03-31", 247417000000], [ "AAPL", "МРТ", "2017-12-30", 239176000000], [ "AAPL","МРТ", "2017-09-30", 229234000000], [ "AAPL", "МРТ", "2017-07-01", 223507000000], [ "AAPL", "МРТ", "2017-04-01»220457000000], [ "AAPL", "МРТ", "2016-12-31", 218118000000], [ "AAPL", "МРТ", "2016-09-24", 215639000000], [ "AAPL","МРТ", "2016-06-25", 220288000000], [ "AAPL", "МРТ", "2016-03-26", 227535000000], [ "AAPL", "МРТ", "2015-12-26»234988000000], [ "AAPL", "МРТ", "2015-09-26", 233715000000], [ "AAPL", "МРТ", "2015-06-27", 224337000000], [ "AAPL", "МРТ", "2015-03-28", 212164000000], [ "AAPL", "МРТ", "2014-12-27", 199800000000], [ "AAPL", "МРТ", "2014-09-27" , 182795000000], [ "AAPL", "МРТ", "2014-06-28", 178144000000], [ "AAPL", "МРТ", "2014-03-29", 176035000000], "столбцы":[{ "имя": "тикер", "тип": "String"}, { "имя": "размер", "тип": "String"}, { "имя": "datekey", "тип":"Дата"}, {"имя": "доход", "тип": "целое число"}]}, "мета": {"next_cursor_id": null}}

import quandl, requests
from flask import request
from cs50 import SQL
db = SQL("sqlite:///formula.db")

data = 
requests.get(f"https://www.quandl.com/api/v3/datatables/SHARADAR/SF1.json?ticker=AAPL&qopts.columns=ticker,dimension,datekey,revenue&api_key=YOURAPIKEY")

responses = data.json()
print(responses)

for response in responses:
    ticker=str(response["ticker"])
    dimension=str(response["dimension"])
    datekey=str(response["datekey"])
    revenue=int(response["revenue"])
    db.execute("INSERT INTO new(ticker, dimension, datekey, revenue) VALUES(:ticker, :dimension, :keydate, :revenue)", ticker=ticker, dimension=dimension, datekey=datekey, revenue=revenue)

Я получаюСледующая ошибка msg (которая у меня была в прошлом и успешно устранена), поэтому я твердо верю, что я не правильно читаю json: Файл "new2.py", строка 12, в ticker = str (response ["ticker"])Ошибка типа: строковые индексы должны быть целыми числами

Я хочу иметь возможность циклически проходить через json и иметь возможность изолировать конкретные данные, чтобы затем заполнить базу данных.

1 Ответ

0 голосов
/ 23 декабря 2018

для вашей структуры ответа у вас есть вложенный объект dict:

datatable
   data
      list of lists of data

, так что это произойдет:

responses = data.json()
datatable = responses['datatable']  # will get you the information mapped to the 'datatables' key
datatable_data = datatable['data']  # will get you the list mapped to the 'data' key

Теперь datatable_data - это список списков,право?и списки могут быть доступны только по индексной точке, а не по строкам

, поэтому допустим, что вы хотите получить первый ответ.

first_response = datatable_data[0]

, который приведет к

first_response = ["AAPL","MRY","2018-09-29",265595000000]

к которому теперь можно получить доступ по индексной точке:

for idx, val in enumerate(first_response):
    print(f'{idx}\t{val}')

, которая выведет

0   AAPL
1   MRY
2   2018-09-29
3   265595000000

, поэтому, со всей этой информацией, вам нужно изменить свою программу, чтобы убедиться, что выполучить доступ к ключу data в ответе, а затем выполнить итерацию по списку списков.

Итак, как-то так:

data = responses['datatable']['data']
for record in data:
   ticker, dimension, datekey, revenue = record  # unpack list into named variables
   db.execute(...)
...