如何使用Python模块“请求”在POST请求中传递json文件或对象

时间:2020-04-27 18:13:33

标签: python json api python-requests typeerror

我正在使用站点的REST API,主要是使用Python的“请求”模块来获取json响应。 GET请求的目标是最终拉出用户的表单响应,该响应最终是一个复杂的json文档。要解决这个问题:

user_form_submission = requests.get('https://www.url/doc.json',
        auth = (api_key, secret),
        params = params)

python_obj = json.loads(user_form_submission.text)
trimmed_dict = python_obj['key'][0]['keys']

对于上下文,这是trimmed_dict格式为.json的内容:

{
    "Date": { "value": "2020-04-26", "type": "date" },
    "Location": {
      "value": "Test ",
      "type": "text",
      "geostamp": "lat=34.00000, long=-77.00000, alt=17.986118, hAccuracy=65.000000, vAccuracy=10.000000, timestamp=2020-04-26T23:39:56Z"
    },
    "form": {
      "value": [
        {
          "form_Details": {
            "value": [
              {
                "code": {
                  "value": "0000000000",
                  "type": "barcode"
                },
                "Name": { "value": "bob", "type": "text" }
              }
            ],
            "type": "group"
          },
          "Subtotal": { "value": "4", "type": "decimal" },
          "form_detail2": {
            "value": [
              {
                "name": {
                  "value": "billy",
                  "type": "text"
                },
                "code": {
                  "value": "00101001",
                  "type": "barcode"
                },
                "Classification": {
                  "value": "person",
                  "type": "select1"
                },
                "Start_Time": { "value": "19:43:00", "type": "time" },
                "time": { "value": "4", "type": "decimal" }
                }
            ],
      "type": "subform"}
        }
    ]
    }
}

现在我有一部分包含有用和无用的json。从这一点来看,我可以在POST中传递此obj吗?我已经尝试了所有可以想到的方法,但已将其关闭。

了解我想怎么做,这就是我认为的样子:

json_post = requests.post(' https://url/api/doc.json', 
        auth = (api_key, secret), 
        json = {
            "form_id" : 'https://url.form.com/formid',
            'payload':{
                 json.dumps(trimmed_dict)
             }})

但是,当我这样做时,出现以下错误-

    TypeError: Object of type set is not JSON serializable

如何通过本POST推送此命令?如果有更有效的解决方法,我很乐意提出建议。

2 个答案:

答案 0 :(得分:1)

尝试删除Hammer周围的花括号。 json.dumps(trimmed_dict)将您的json.dumps变成一个字符串,当用大括号包围时,它将变成一个蟒蛇trimmed_dict

另外,您可以删除set并将json.dumps作为与trimmed_dict关联的值直接插入结构。

答案 1 :(得分:1)

从有效内容中删除多余的{}。有效负载本身就是一个密钥,而json.dumps(trimmed_dict)作为一个值就足够了

json_post = requests.post(' https://url/api/doc.json', 
        auth = (api_key, secret), 
        json = {
            "form_id" : 'https://url.form.com/formid',
            "payload": json.dumps(trimmed_dict)
             })