如何在Python中解析HTTP POST请求的嵌套JSON字符串并提取键值?
解析POST请求中嵌套的转义JSON字段
我用Python的BaseHTTPRequestHandler实现了一个HTTP服务,用于接收外部应用发送的JSON格式POST请求。请求Payload里的objectJSON字段是一个转义后的JSON字符串,需要提取该字段并解析出其中的所有键值对,目前仅能提取字符串,无法解析内部结构。
修改后的完整脚本
import json import logging from http.server import BaseHTTPRequestHandler, HTTPServer class S(BaseHTTPRequestHandler): def _set_response(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() def do_GET(self): logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers)) self._set_response() self.wfile.write("GET request for {}".format(self.path).encode('utf-8')) def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) self._set_response() self.wfile.write("POST request for {}".format(self.path).encode('utf-8')) # 解析外层JSON结构 json_obj = json.loads(post_data) # 提取objectJSON字段的转义字符串 object_json_str = json_obj["objectJSON"] # 解析内层转义JSON为Python字典 object_data = json.loads(object_json_str) # 遍历输出所有键值对,可按需修改处理逻辑 for key, value in object_data.items(): print(f'"{key}":"{value}"') def run(server_class=HTTPServer, handler_class=S, port=8090): logging.basicConfig(level=logging.INFO) server_address = ('', port) httpd = server_class(server_address, handler_class) logging.info('Starting httpd...\n') try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() logging.info('Stopping httpd...\n') if __name__ == '__main__': from sys import argv if len(argv) == 2: run(port=int(argv[1])) else: run()
关键修改说明
- 对提取到的
objectJSON字符串,额外调用一次json.loads(),将转义的JSON格式字符串转换为Python字典 - 通过遍历字典的
items()方法,可以逐个获取键值对,根据业务需求进行打印、存储或返回等操作
测试输出
使用提供的示例Payload发送POST请求后,控制台将输出:
"Enter Sleep":"0" "Exit Sleep":"0" "Low Power":"0" "Packet":"Uplink alerting message" "Power Off":"0" "Remove Device":"0" "SOS Exit":"1" "Time Stamp":"6:04:24 2022/1/31" "Wearing Device":"0"
内容的提问来源于stack exchange,提问作者bizkit1
相关产品推荐
相关产品推荐

