将Python JSON迭代转换为POST请求

将Python JSON迭代转换为POST请求,python,json,rest,http-post,httprequest,Python,Json,Rest,Http Post,Httprequest,我有一个JSON文件,格式如下 { "unknown1": [ {"text": "random text again", "time": "Thu May 15 19:21:59 +0000 2016"}, "text": "akmfkdlm safsa fasffalmfa", "time": "Thu May 21 09:53:51 +0000 2016"} ] "unknown2": [

我有一个JSON文件,格式如下

{
   "unknown1": 
   [
        {"text": "random text again",
        "time": "Thu May 15 19:21:59 +0000 2016"}, 
        "text": "akmfkdlm safsa fasffalmfa",
        "time": "Thu May 21 09:53:51 +0000 2016"}
   ]
   "unknown2":
   [ 
        "text": "fsda lmfalmfa",
        "time": "Thu May 21 09:53:51 +0000 2016"},
   ]
}
JSON中的第一项是一个随机(未知)标签,可以有任意数量的未知项。在这些未知数中总是有一堆
文本
/
时间
配对

我正在尝试将每个
文本
发送到我的REST post服务中,该服务接受JSON格式的

text: "foo bar bat",
mime_type: "text/html",
extract_type: "HP" # HP, MP
因此,当我试图运行我的代码时,我遇到了这个错误,我不知道该怎么做

这是我的密码:

import json
import requests

with open('locations_stripped.json') as data_file:
    data = json.load(data_file)

headers = {'Content-Type' : 'application/json'}

for thing in data:
    for text, time in data.iteritems():
        print text
        body = [{ "text": text , "mime_type": "text/html", "extract_type": "HP"}]
        r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)
        print (r.content)
下面是错误:

 $ python filterrest.py
unknown1
Traceback (most recent call last):
  File "filterrest.py", line 30, in <module>
    r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py", line 111, in post
return request('post', url, data=data, json=json, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 461, in request
prep = self.prepare_request(req)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 394, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 298, in prepare
self.prepare_body(data, files, json)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 452, in prepare_body
body = self._encode_params(data)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 89, in _encode_params
for k, vs in to_key_val_list(data):
ValueError: too many values to unpack
正如我所期望的那样,这会打印文本['text']。问题在于我执行请求的方式。作为测试,我更改了代码,并将数据设置为我知道应该工作的数据(我通过运行它)

更改代码:

r = requests.post('localhost:3003/api/extract/run', data='Hello. Where does the brown fox go?', headers=headers)
预期答复:

[
  {
    "score": 0.30253747367501777,
    "tag": "HP",
  }
]

相反,打印出来的是看起来像整个HTML页面的内容

假设您有一个有效的json。首先需要遍历对应于“未知”键的列表,现在该列表再次包含字典 使用
文本
时间

for unknown_key in data:
    for obj in data[unknown_key]:
         body = { "text": obj['text'] , "mime_type": "text/html", "extract_type": "HP"}
         r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)
         print (r.content)

假设您有一个有效的json。首先需要遍历对应于“未知”键的列表,现在该列表再次包含字典 使用
文本
时间

for unknown_key in data:
    for obj in data[unknown_key]:
         body = { "text": obj['text'] , "mime_type": "text/html", "extract_type": "HP"}
         r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)
         print (r.content)

关于你问题的第一部分:

for thing in data:
    for text, time in data.iteritems():
使用此循环,您将无法获得
文本
。您的更新包括:

for thing in data:
    for text in data[thing]:
        print text['text']
这是正确的。您的
标题是正确的。下一个问题是:

body = [{ "text": text , "mime_type": "text/html", "extract_type": "HP"}]
r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)
现在查看模块请求的文档:

通常,您希望发送一些表单编码的数据,很像HTML 形式。为此,只需向数据参数传递一个字典。你的 请求时,数据字典将自动进行表单编码 制造

很多时候,您希望发送的数据不是 表格编码。如果传入的是字符串而不是dict,则该数据 将直接发布

对于关键字参数
data
,必须提供
dict
或有效的json
str
。问题中的变量
body
列表中出现,并且在更新中是无效的json
str
。有两种解决方案:

body = { "text": text , "mime_type": "text/html", "extract_type": "HP"}
# Dont't forget: dict will be used to send form-encoded data
# It will work. But not a intended solution for json data
r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)

但是,请求文件说:

您也可以直接传递dict,而不是自己编码dict 使用json参数(在版本2.4.2中添加),它将 自动编码

因此,在版本2.4.2中,最好使用关键字参数
json
而不是
data
来发送json数据。所以这是最好的解决方案:

body = { "text": text , "mime_type": "text/html", "extract_type": "HP"} 
r = requests.post('localhost:3003/api/extract/run', json=body, headers=headers)
总结

我使用这个来源:

{
   "unknown1": 
   [
        {"text": "random text again",
        "time": "Thu May 15 19:21:59 +0000 2016"}, 
        "text": "akmfkdlm safsa fasffalmfa",
        "time": "Thu May 21 09:53:51 +0000 2016"}
   ],
   "unknown2":
   [ 
        "text": "fsda lmfalmfa",
        "time": "Thu May 21 09:53:51 +0000 2016"},
   ]
}
代码:


我不知道你的服务器,所以我无法测试它。我希望它能起作用。

关于你问题的第一部分:

for thing in data:
    for text, time in data.iteritems():
使用此循环,您将无法获得
文本
。您的更新包括:

for thing in data:
    for text in data[thing]:
        print text['text']
这是正确的。您的
标题是正确的。下一个问题是:

body = [{ "text": text , "mime_type": "text/html", "extract_type": "HP"}]
r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)
现在查看模块请求的文档:

通常,您希望发送一些表单编码的数据,很像HTML 形式。为此,只需向数据参数传递一个字典。你的 请求时,数据字典将自动进行表单编码 制造

很多时候,您希望发送的数据不是 表格编码。如果传入的是字符串而不是dict,则该数据 将直接发布

对于关键字参数
data
,必须提供
dict
或有效的json
str
。问题中的变量
body
列表中出现,并且在更新中是无效的json
str
。有两种解决方案:

body = { "text": text , "mime_type": "text/html", "extract_type": "HP"}
# Dont't forget: dict will be used to send form-encoded data
# It will work. But not a intended solution for json data
r = requests.post('localhost:3003/api/extract/run', data=body, headers=headers)

但是,请求文件说:

您也可以直接传递dict,而不是自己编码dict 使用json参数(在版本2.4.2中添加),它将 自动编码

因此,在版本2.4.2中,最好使用关键字参数
json
而不是
data
来发送json数据。所以这是最好的解决方案:

body = { "text": text , "mime_type": "text/html", "extract_type": "HP"} 
r = requests.post('localhost:3003/api/extract/run', json=body, headers=headers)
总结

我使用这个来源:

{
   "unknown1": 
   [
        {"text": "random text again",
        "time": "Thu May 15 19:21:59 +0000 2016"}, 
        "text": "akmfkdlm safsa fasffalmfa",
        "time": "Thu May 21 09:53:51 +0000 2016"}
   ],
   "unknown2":
   [ 
        "text": "fsda lmfalmfa",
        "time": "Thu May 21 09:53:51 +0000 2016"},
   ]
}
代码:


我不知道你的服务器,所以我无法测试它。我希望它能工作。

您的Json格式是错误的。请看这里的
“text:“akmfkdlm safsa fasffalmfa”
。您的
正文是一个
列表
。对于数据中的内容,它必须是一个
命令:对于文本,数据中的时间。iteritems():
也是假的;)哎呀。我是手动输入JSON的,但它是直接从一个文件中输入的,所以JSON肯定是有效的。虽然编辑了这个问题,使其有效!但就像我写的那样。Int
data=body
body
必须是一个
dict
啊哈好的。这似乎解决了问题,但出于某种原因,我的请求在打印出来时看起来很简单创建一个完整的HTML页面而不是响应。您的Json格式为false。请查看此处的
“文本:”akmfkdlm safsa fasffalmfa“
。您的
正文
是一个
列表
。对于数据中的内容,它必须是
dict
:对于文本,数据中的时间。iteritems():
也是false;)哎呀。我手动输入了JSON,但它直接来自一个文件,因此JSON绝对有效。但是,编辑了该问题以使其有效!但就像我写的。Int
data=body
body
必须是一个
dict
Ahhh OK。这似乎解决了问题,但出于某种原因,我的请求在打印时看起来像是一个完整的HTML页面,而不是一个响应。我可以看出,这通过输入正确的
文本来纠正我的问题,因为我尝试将我的代码更改为您的
,用于数据中的内容:用于文本,数据中的时间。iteritems():打印文本
,但我的问题似乎在其他地方。我已经用您在请求中发送文本数据的信息更新了我的问题,而在您的标题中有
'Content-Type':'application/json'
text d