def json_to_url_params(json_obj): #body = {'sdkVersion': '1.0.30_1','timestamp': timestamp,'vin':"LJUBMSA24PKFFF198"} # 要发送的数据 if isinstance(json_obj, dict): # 对字典类型的值进行处理 items = json_obj.items() elif isinstance(json_obj, list): # 对列表类型的值进行处理 items = enumerate(json_obj) else: # 对其他类型的值直接返回字符串形式 return str(json_obj) # 递归处理每个键值对,并按 ASCII 码排序 params = [] for key, value in sorted(items, key=lambda x: str(x[0])): if isinstance(value, (dict, list)): # 对嵌套的字典或列表类型的值进行递归处理 sub_params = json_to_url_params(value) params.extend([(f"{key}.{sub_key}", sub_value) for sub_key, sub_value in sub_params]) else: # 对其他类型的值进行 URL 编码后拼接成键值对 params.append((str(key), quote_plus(str(value)))) if isinstance(value, dict): # 对字典类型的值进行递归处理 sub_params = dict_to_url_params(value) url_params.extend([(f"{key}.{sub_key}", sub_value) for sub_key, sub_value in sub_params]) elif isinstance(value, list): # 对列表类型的值进行递归处理 sub_params = list_to_url_params(value) url_params.extend([(f"{key}[]", sub_value) for sub_value in sub_params]) return params sorted_json = json.dumps(body, sort_keys=True) # 将排序后的JSON对象转换为URL键值对拼接的字符串 上面的函数需要将字典跟列表分开处理 请修改
时间: 2024-03-03 22:48:51 浏览: 130
json_to_string.rar_JSON_json string_json to Stri_json to string_
修改后的函数如下:
```
from urllib.parse import quote_plus
def json_to_url_params(json_obj):
"""
将 JSON 对象转换为 URL 参数形式的字符串
"""
# 递归处理每个键值对,并按 ASCII 码排序
def process_item(key, value):
if isinstance(value, (dict, list)):
# 对嵌套的字典或列表类型的值进行递归处理
sub_params = json_to_url_params(value)
return [(f"{key}.{sub_key}", sub_value) for sub_key, sub_value in sub_params]
else:
# 对其他类型的值进行 URL 编码后拼接成键值对
return [(str(key), quote_plus(str(value)))]
params = []
if isinstance(json_obj, dict):
# 对字典类型的值进行处理
for key, value in sorted(json_obj.items(), key=lambda x: str(x[0])):
params.extend(process_item(key, value))
elif isinstance(json_obj, list):
# 对列表类型的值进行处理
for i, value in enumerate(json_obj):
params.extend(process_item(i, value))
else:
# 对其他类型的值直接返回字符串形式
return str(json_obj)
return params
```
这个函数将字典和列表的处理方式分别封装在了 `process_item` 函数中,便于递归调用。同时,使用了 `isinstance` 函数判断值的类型,而非直接判断是否是字典或列表,更加灵活。
阅读全文