import json def sort_dict(d): """对字典按ASCII码升序排序""" return dict(sorted(d.items())) def to_url_query(d, prefix=''): """将字典转换为URL键值对形式的字符串""" query_list = [] for k, v in sort_dict(d).items(): key = f'{prefix}.{k}' if prefix else k # 处理嵌套字典的键名 if isinstance(v, dict): query_list.append(to_url_query(v, key)) elif isinstance(v, list): for i, item in enumerate(v): query_list.append(to_url_query(item, f'{key}[{i}]')) else: query_list.append(f'{key}={v}') return '&'.join(query_list) if __name__ == '__main__': json_str = '{ "timestamp":1529724024, "sign":"2729c9e1e36dfee2f08c3487ed402dc1", "networkInfo": { "netType": "成功", "lac": "0210", "cid": "" }, "ecus":[ { "ecuPartNum":"ecu1", "ecuSwDid":"", "ecuSVer":"v1", }, { "ecuPartNum":"ecu2", "ecuSwDid":"3333", "productDate":"2018-05-22", } ] }' data = json.loads(json_str) query_str = to_url_query(data) print(query_str) 上面的代码做一下修正 如果key对应的value是空或者空字符串不拼接
时间: 2023-07-03 19:31:53 浏览: 53
可以在拼接时加一个判断,如果值为空或者空字符串则不拼接,例如:
```python
for k, v in sort_dict(d).items():
if not v: # 如果值为空或者空字符串则不拼接
continue
key = f'{prefix}.{k}' if prefix else k # 处理嵌套字典的键名
if isinstance(v, dict):
query_list.append(to_url_query(v, key))
elif isinstance(v, list):
for i, item in enumerate(v):
query_list.append(to_url_query(item, f'{key}[{i}]'))
else:
query_list.append(f'{key}={v}')
```
这样可以实现如果值为空或者空字符串则不拼接的功能。
相关问题
def __str__(self): return json.dumps(dict(self), ensure_ascii=False) def __repr__(self): return self.__str__() 什么意思
这段代码定义了一个 Python 类的两个特殊方法 `__str__()` 和 `__repr__()`, 用于返回该类的字符串表示。`__str__()` 方法用于返回对象的“可读性好”的字符串表示,而 `__repr__()` 方法返回对象的“机器可读”的字符串表示。
具体来说,这段代码中,`__str__()` 方法将该类的实例转换为一个 Python 字典,然后将该字典使用 JSON 编码为一个字符串,并指定 `ensure_ascii=False` 参数以保留非 ASCII 字符。`__repr__()` 方法则直接调用 `__str__()` 方法来返回该类实例的字符串表示。
class MonitoringProcess: conn1, conn2 = Pipe() monitor = True def __init__(self): self.process_start(self.detection_status) def set_monitor(self): self.com_dict["monitor"] = False def process_start(self, func): with Manager() as manager: self.com_dict = manager.Namespace() p = Process(target=func, args=(self.com_dict,)) p.start() def detection_status(self, com_dict): ... com_dict.a=1
在你的代码中,你使用了 `multiprocessing.Manager` 来创建一个共享的命名空间对象,但是在 `detection_status` 方法中,你尝试直接给 `com_dict` 添加了一个属性 `a`。然而,在 `Manager` 创建的命名空间对象中,你应该使用点语法来访问和修改属性,而不是使用赋值语句。
以下是修正后的代码示例:
```python
from multiprocessing import Process, Manager, Pipe
class MonitoringProcess:
def __init__(self):
self.conn1, self.conn2 = Pipe()
self.monitor = True
self.process_start(self.detection_status)
def set_monitor(self):
self.com_dict.monitor = False
def process_start(self, func):
with Manager() as manager:
self.com_dict = manager.Namespace()
p = Process(target=func, args=(self.com_dict,))
p.start()
def detection_status(self, com_dict):
# some code ...
com_dict.a = 1
```
在修正后的代码中,我修改了 `conn1, conn2 = Pipe()`,将其放在了 `__init__` 方法中,以确保正确的初始化。同时,在 `detection_status` 方法中,我使用了点语法来给 `com_dict` 对象添加属性 `a`。
希望这次能够帮助你解决问题。如果还有其他疑问,请随时提问。