2016-02-03 1 views
0

Я пытаюсь создать сценарий питона, который делает следующее:Python POST через REST ошибки API JSONArray не может быть приведен к JSONObject

  • Разбор CSV файл
  • Послать CSV файл на удаленный сервер с помощью REST API

Код, который у меня есть, предназначен для анализа файла CSV и преобразования его в объект JSON.

Однако, когда она импортирует на удаленный сервер, сообщение об ошибке возвращается: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject

Я думаю, что это может быть потому, что мой код создает массив объектов, а не объект JSON. Как я могу решить проблему, чтобы мой скрипт загружал данные CSV и правильно отображал столбцы и значения в удаленной таблице?

#Requests package for python import requests 
import csv 
import json 
import requests 

f = open('example_import_csv.csv', 'rU') 
reader = csv.DictReader(f, fieldnames = ("u_date","u_product","u_serial_number")) 
out = json.dumps([row for row in reader]) 
print(out) 

#Set request parameters 
url = 'xxxxxx' 
user = 'xxxxxx' 
pwd = 'xxxxxxxx' 

#Set proper headers 
headers = {"Content-Type":"application/json","Accept":"application/json"} 

response = requests.post(url, auth=(user, pwd), headers=headers ,data=out) 

#Check for HTTP codes other than 200 
if response.status_code != 200: 
    print('Status:', response.status_code, 'Headers:', response.headers, 'Response Text', response.text, 'Error Response:',response.json()) 
    exit() 

#Decode the JSON response into a dictionary and use the data 
print('Status:',response.status_code,'Headers:',response.headers,'Response:',response.json()) 

ВЫВОД

[{"u_date": "u_date", "u_product": "u_product", "u_serial_number": "u_serial_number"}, {"u_date": "1/12/15", "u_product": "Apples", "u_serial_number": "11"}, {"u_date": "1/29/15", "u_product": "Pears", "u_serial_number": "12"}, {"u_date": "1/12/15", "u_product": "Oranges", "u_serial_number": "13"}, {"u_date": "1/29/15", "u_product": "Blackberries", "u_serial_number": "14"}, {"u_date": "2/5/15", "u_product": "Blueberries", "u_serial_number": "15"}, {"u_date": "2/7/15", "u_product": "Bananas", "u_serial_number": "16"}, {"u_date": "2/7/15", "u_product": "Strawberries", "u_serial_number": "17"}] 

Status: 200 Headers: {'Strict-Transport-Security': 'max-age=15768000; includeSubDomains;','Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json;charset=utf-8'} 
Response: {'reason': None, 'error': 'org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject'} 

EDIT:

Запрос должен быть объект JSON. Мне нужен формат, который должен быть объектом JSON, содержащим один массив.

Я проверил вручную создание объекта json в этом формате, и он работает. Как я могу разобрать CSV-файл, чтобы получить его в этом конкретном формате?

{"records":[{"u_date": "u_date", "u_product": "u_product", "u_serial_number": "u_serial_number"}, {"u_date": "1/12/15", "u_product": "Apples", "u_serial_number": "11"}, {"u_date": "1/29/15", "u_product": "Pears", "u_serial_number": "12"}, {"u_date": "1/12/15", "u_product": "Oranges", "u_serial_number": "13"}, {"u_date": "1/29/15", "u_product": "Blackberries", "u_serial_number": "14"}, {"u_date": "2/5/15", "u_product": "Blueberries", "u_serial_number": "15"}, {"u_date": "2/7/15", "u_product": "Bananas", "u_serial_number": "16"}, {"u_date": "2/7/15", "u_product": "Strawberries", "u_serial_number": "17"}]} 

ответ

1

Просто обернуть массив в подходящем Словаре:

out = json.dumps({'records': [row for row in reader]}) 

Вы также можете оставить кодировку requests, передавая объект должен быть закодирован as json parameter вместо data:

out = {'records': [row for row in reader]} 
requests.post(url, json=out, ...) 

В этом случае запросы также автоматически устанавливают заголовок типа контента на application/json, поэтому вам не нужно делать это manua LLY.

Смежные вопросы