格式化嵌套的json以用于Python请求

时间:2014-11-25 12:32:46

标签: python json nested python-requests

我一直在努力解决HTTP 500(错误的语法/字符串)错误,并且经过一些搜索后我无法在任何地方找到解决方案。我有一个嵌套的json PUT请求,我已经能够使用一些API工具(浏览器扩展和独立程序)工作,但当我尝试在Python的HTTP请求模块中使用json时,我继续获取返回的500错误代码。

我已经得到了其他更简单的jsons(例如data = {" RequestID":" 71865"})使用类似的代码来处理以下内容,这让我相信某些东西是没有得到正确的格式化,不幸的是,我对这个json-python的东西太新了,无法弄明白。我认为问题是因为python处理嵌套json的方式。

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import requests
import json

USER_NAME=u"myusername"
USER_PASS=u"mypassword"

PUT_URL="https://webservice.url.com/A/Path/To/Create/"

headers = {"Content-Type": "application/json"}
data = {
"ListOfFields": {
        "Field": [
            {"fieldname": "summary","value": "test summary"},
            {"fieldname": "notes","value": "an example json PUT"},
            {"fieldname": "user","value": "myuser"}
        ]
    }
}
data_json = json.dumps(data)
payload = {'json_playload': data_json } ## I have tried with and without this line.

r = requests.put('{}'.format(PUT_URL), data=data_json, headers=headers, auth=(USER_NAME, USER_PASS), timeout=10)
# r = requests.put('{}'.format(PUT_URL), data=payload, headers=headers, auth=(USER_NAME, USER_PASS), timeout=10)

我已尝试将数据值放入引号,单行,并进行一些其他轻微调整,但我一直收到500错误。

print(r.status_code)
>> 500

如前所述,我已经使用GET和POST以及相同的Web服务器在python中使用类似的代码,但这个让我头疼!

2 个答案:

答案 0 :(得分:8)

当将嵌套的JSON传递给data param时,Requests库有一种讨厌数据的习惯。为避免这种情况,请将其传递到json参数:

r = requests.put(PUT_URL, json=data_json, headers=headers, auth=(USER_NAME, USER_PASS), timeout=10)

有关详细信息,请查看类似问题的答案:Post JSON using Python Requests

答案 1 :(得分:0)

你想要打印你的JSON数据吗?试试这个:

data_json = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))

请参阅https://docs.python.org/2/library/json.html