正确解码 json 文件,当通过消息请求将其作为输入时

Decode a json file properly, when get it as an input via message request

提问人:singa1994 提问时间:4/14/2021 最后编辑:Mark Rotteveelsinga1994 更新时间:4/14/2021 访问量:126

问:

我想阅读通过 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格式?

python json 亚马逊网络服务 web-services pytorch

评论

1赞 JD2775 4/14/2021
问题是 vs ?"imageX""imgX"
0赞 singa1994 4/14/2021
不,已更正

答:

1赞 pazitos10 4/14/2021 #1

为避免来自 API 的 json 响应出现问题,可以使用 lib。特别是返回一个字典,这样你就不必手动转换内容。jsonjson.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_inputsmsk_inputsimg_inputs['key']

    #...   
    for img_inputs, msk_inputs in zip(json_obj['imgX'], json_obj['imgY']):
        key = img_inputs[0]['key']
    #...

在这种情况下(我修改了我的代码),将返回列表中的第一个元素 for 和 因此该步骤不是必需的,并且您的 for 循环很好。zip()img_inputsmsk_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是上述文件。我可以确认该服务已正确初始化。但是,无论请求是否绝对正确,以及错误是否来自该方面,我都不是真的。欢迎任何帮助。