Опубликовать запросы в Python для объектов JSON - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть датафрейм (df) в пандах, который я преобразовал в JSON formot как:

json_obj = df.to_json(orient=records).

Объект json выглядит (скажем):

json_obj = [
    {"a": "xxx", "b":"pqr", "c": 1},
    {"a": "uuy", "b":"abc", "c": 3},
    {"a": "yty", "b":"nnq", "c": 7}
]

Теперь, когдаЯ отправляю данные, используя URL-адрес API (например, urlex) (действительный) как

import requests

r1 = requests.post('urlex', json = [
    {"a": "xxx", "b":"pqr", "c": 1},
    {"a":"uuy", "b":"abc", "c": 3},
    {"a": "yty", "b":"nnq", "c": 7}
]

print (r1.status_code)

print(r1.content)

. Я получаю код ответа 200 с **b'{"success":true}'**

Однако, когда я делаю то же самоес

r1 = requests.post('urlex', json = json_obj ]

print (r1.status_code)

print(r1.content)

Я получаю код ответа 200 с **b'{"success":false}'**

Чего мне не хватает и в чем проблема?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы можете воспользоваться пакетами simplejson или json:

import simplejson as json

response = requests.post('http://localhost:8888', data=json.loads(df.to_json(orient='records')),
headers={'Content-Type': 'application/json'}
)

Кроме того, если вы не хотите ориентироваться как записи, вы можете использовать to_dict вместо to_json

response = requests.post('http://localhost:8888', data=df.to_dict(),
headers={'Content-Type': 'application/json'}
)

Причина, по которой это работает, заключается в том, что аргумент data в пакете requests принимает строку.

0 голосов
/ 16 ноября 2018

Я думаю, что ваша проблема в том, что pd.DataFrame.to_json возвращает строку:

data = pd.DataFrame({'a': [1, 2]})
type(data.to_json())
str

но аргумент json для ключевого слова requests.post ожидает объект python. Если вы хотите отправить строку сына, используйте вместо этого аргумент data=:

# this submits a jsonified string
response = requests.post('http://localhost:8888', json=data.to_json())
print(response.request.body.decode('utf-8'))
"{\"a\":{\"0\":1,\"1\":2}}"


# this submits the actual json object
response = requests.post(
    'http://localhost:8888',
    data=data.to_json().encode('utf-8'),
    headers={'Content-Type': 'application/json'}
)
print(response.request.body.decode('utf-8')
{"a":{"0":1,"1":2}}

Я не уверен, нужно ли кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...