【问题标题】:Python POST via REST API error JSONArray cannot be cast to JSONObjectPython POST via REST API 错误 JSONArray cannot be cast to JSONObject
【发布时间】:2016-02-03 16:28:12
【问题描述】:

我正在尝试创建一个执行以下操作的 python 脚本:

  • 解析 CSV 文件
  • 通过 REST API 将 CSV 文件发送到远程服务器

我的代码正在解析 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'}

编辑:

请求必须是 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"}]}

【问题讨论】:

    标签: python json api rest csv


    【解决方案1】:

    只需将您的数组包装在合适的字典中:

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

    您还可以通过传递要编码的对象as json parameter 而不是data 来将编码留给requests

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

    在这种情况下,请求还会自动将内容类型标头设置为application/json,因此您不必手动执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多