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

Posted

技术标签:

【中文标题】格式化嵌套 json 以用于 Python 请求【英文标题】:Formatting a nested json for use with Python Requests 【发布时间】:2015-01-23 11:10:50 【问题描述】:

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

我已经获得了其他更简单的 json(例如 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 中获得了类似的代码,但是这个让我很头疼!

【问题讨论】:

你能不能透露一下网址 - 这将有助于我快速回答这个问题,谢谢 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

您想漂亮地打印您的 JSON 数据吗?试试这个:

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

见https://docs.python.org/2/library/json.html

【讨论】:

以上是关于格式化嵌套 json 以用于 Python 请求的主要内容,如果未能解决你的问题,请参考以下文章

从 Python 编写嵌套拼花格式

如何将此嵌套的 JSON 以柱状形式转换为 Pandas 数据框

使用 POST 请求 iOS Swift 3 发送嵌套 JSON

哪些数据交换格式可用于 python 和 java 应用程序相互通信?

如何使用python取消嵌套json格式的数据

用于深层嵌套对象的自定义Json Serializer