从URL参数(字节)到JSON字符串

2024-09-22 16:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用它将URL参数(在HTTP请求主体中作为字节接收)转换为JSON字符串:

import urllib.parse, json

def params_asbytes_to_json(b):
    s = b.decode()  # bytes to str
    x = urllib.parse.parse_qsl(s)  # parse_qsl
    d = dict(x)  # convert to dict
    return json.dumps(d)  # convert to string with json 

print(params_asbytes_to_json(b'a=b&c=d'))  # {"a": "b", "c": "d"}

它可以工作,但由于它涉及许多编码/解码步骤,我怀疑它效率低下(如果我的服务器接收到许多请求)

从字节a=b&c=d到JSON字符串{"a": "b", "c": "d"}是否有更短/更快的距离?


PS:此数据从HTML <form>发送,如下所示:

<form action='/do' method='post'>
<input type='text' name='a' value='b'>
<input type='submit'>
</form>

对于其他页面,通过(普通)Javascript:

var xhr = new XMLHttpRequest();
xhr.open("POST", "/do");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var fd = new FormData(document.querySelector('form'));
fd.append('dt', +new Date());
xhr.send(new URLSearchParams(fd).toString());

PS:我已经阅读了How to send a JSON object using html form data,但是我需要我的网站工作,即使Javascript被禁用,所以我不能100%依赖XMLHttpRequest+JSON.serialize:它只需要一个<form>提交即可。据我所知,标准HTML表单不能直接作为JSON发布,对吗


Tags: to字符串formjsonnew字节parsetype
1条回答
网友
1楼 · 发布于 2024-09-22 16:29:09

您可以使用urllib.parse.parse_qs()而不是urllib.parse.parse_qsl()来保存一个步骤。它返回一个字典而不是一个列表,因此不需要dict()步骤

但是,正如注释中指出的,这将把字典值设置为列表,而不是单个字符串,以允许查询字符串中存在重复键。您的版本只会丢弃重复项。因此,要么按您的方式执行,要么在调用json.dumps()之前从字典中的列表中提取元素

您也不需要使用b.decode()urllib.parse函数接受bytes对象并对其进行解码

相关问题 更多 >