Python使用json.dumps打印JSON单个属性无对应键的问题咨询
问题根因
你现在用json.dumps()打印单个订单属性的时候,传给序列化方法的是从订单字典里单独抠出来的纯值——比如wcorders[i]["id"]本质就是个数字727,你既没把对应的键名放进去,也没把键值对的映射结构传进去,那序列化出来当然就只有值本身,不会自动带键名。
你之前想手动在print里写键名的思路完全可行,只是给单值加了indent缩进参数,导致输出的时候键和值换行了,看起来像是键完全没生效。
可落地的解决方法
1. 构造结构化字典导出,天然自带键名
不要逐行手动拼接print内容,先把需要导出的订单属性按键值对应关系拼成独立的字典,再整体做序列化输出,结果会自动带完整的键名,不管是打印查看还是后续存成导出文件都通用:
# 先定义需要导出的字段映射:展示用的键名 -> 从订单中取值的方法 export_fields = [ ("ID", lambda order: order.get("id", "")), ("Number", lambda order: order.get("number", "")), ("shipping_company", lambda order: order.get("shipping", {}).get("company", "")) ] # 直接遍历订单列表,不用手动维护循环计数器 for order in wcorders: # 构造带完整键值对的导出对象 order_export = {} for display_key, get_value in export_fields: order_export[display_key] = get_value(order) # 序列化整个字典,自动带对应键名,去掉单值场景下冗余的缩进、排序参数 print(json.dumps(order_export, indent=2, ensure_ascii=False)) # 原有更新订单状态的逻辑保持不变 wcapi.put(f"orders/{order['id']}", {"status": "completed"}).json()
这种写法的优势:
- 后续要新增、删减导出的订单属性,只需要修改
export_fields列表,不需要逐行调整print语句 - 用字典的
get()方法做取值兜底,遇到老订单缺嵌套字段(比如部分订单没有shipping信息)不会直接触发KeyError崩溃 - 输出是标准JSON结构,不需要手动调整格式
2. 保留逐行打印习惯的优化方案
如果你习惯逐行输出单条属性,只需要去掉单值序列化时的冗余缩进参数,改成直接把值拼到对应键名的字符串后面即可,不会出现格式错位:
# 原写法会因为json.dumps的缩进参数导致键和值分行 # print("ID: ", json.dumps(wcorders[i]["id"], indent=4, sort_keys=True)) # 优化后写法 print(f"ID: {wcorders[i]['id']}") print(f"Number: {wcorders[i]['number']}") print(f"shipping: {wcorders[i]['shipping']['company']}")
注意:json.dumps()的indent、sort_keys参数是专门针对字典、数组这类复杂嵌套结构设计的,对单个字符串、数字类的纯值没有任何作用,反而会造成格式冗余,单值打印时完全不需要加。
代码冗余逻辑调整提示
- 你现在请求接口时已经传了
params={"status": "completed"},拿到的订单本身就是已完成状态,后续再调用接口把状态改回completed属于无意义的重复请求,可以按需保留 - 原来的
while i < len(wcorders)+手动累加i的循环写法可以替换成直接遍历订单列表,可读性更强,也不容易出现索引累加错误
内容的提问来源于stack exchange,提问作者ASSolution
相关产品推荐
相关产品推荐

