提问人:singa1994 提问时间:4/14/2021 最后编辑:Mark Rotteveelsinga1994 更新时间:4/14/2021 访问量:126
正确解码 json 文件,当通过消息请求将其作为输入时
Decode a json file properly, when get it as an input via message request
问:
我想阅读通过 curl 发送的请求,如下所示:
curl -X POST http://127.0.0.1:8080/eval/res -v path/request.json。json 的格式如下:
{
"imgX": [{
"key": "x",
"url": "http://127.0.0.1:8080/imgs/x.png"
}],
"imgY": [{
"key": "y",
"url": "http://127.0.0.1:8080/imgs/y.png"
}]
}
服务初始化后,我的代码是:
def preprocess(self, data):
_json = {}
for row in data:
json_obj = row.get("data") or row.get("body")
self.parameter_dict = dict(json_obj)
image_url = ""
json_obj = dict(json_obj)
for img_inputs, msk_inputs in zip(json_obj['imgX'], json_obj['imgY']):
key = img_inputs['key']
但是,这给出了:
KeyError: 'img'
我调试并发现在读取json文件时,每一行都是一个字节数组:
{'body': bytearray(b'')}.
如何解码以恢复.json格式?
答:
1赞
pazitos10
4/14/2021
#1
为避免来自 API 的 json 响应出现问题,可以使用 lib。特别是返回一个字典,这样你就不必手动转换内容。json
json.loads()
例如:
import json
with open('<path_to_file>/request.json','r') as f:
data = f.read()
_json = json.loads(data)
print(_json)
将输出:
{'imgX': [{'key': 'x', 'url': 'http://127.0.0.1:8080/imgs/x.png'}],
'imgY': [{'key': 'y', 'url': 'http://127.0.0.1:8080/imgs/y.png'}]}
另一方面,当您使用时,如果您获得两个列表和 ,每个列表内部都有多个 json 对象/字典,为了正常工作,您需要遍历这些列表的值以获取键。zip()
img_inputs
msk_inputs
img_inputs['key']
#...
for img_inputs, msk_inputs in zip(json_obj['imgX'], json_obj['imgY']):
key = img_inputs[0]['key']
#...
在这种情况下(我修改了我的代码),将返回列表中的第一个元素 for 和 因此该步骤不是必需的,并且您的 for 循环很好。zip()
img_inputs
msk_inputs
确保您从 API 获得有效的 json 响应。
评论
0赞
singa1994
4/14/2021
我遵循了使用 json.loads() 作为数据的解决方案,但得到了这个: TypeError:JSON 对象必须是 str、bytes 或 bytearray,而不是 list
1赞
pazitos10
4/14/2021
请更新您的答案,包括数据请求的代码。此外,根据 JSONLint 的说法,您作为示例提供的 JSON 无效。
0赞
singa1994
4/14/2021
它被更新,请求是在开始时通过 curl 命令给出的。request.json是上述文件。我可以确认该服务已正确初始化。但是,无论请求是否绝对正确,以及错误是否来自该方面,我都不是真的。欢迎任何帮助。
评论
"imageX"
"imgX"