Python向JSON的LogDetails层级追加元素失败求助
向JSON的LogDetails层级追加元素的问题解决
问题描述
作为Python新手,我想要向JSON结构的LogDetails层级(第4层)追加元素,但目前代码只能将元素添加到Logs层级(第3层),达不到预期效果。以下是测试代码、当前运行输出及期望的两次运行结果:
测试代码
import json # 正常是从JSON文件加载,这里直接写出来简化示例 jsonfile = { "Job": { "id": "", "LoggingData": { "Logs":[{ "LogDetails": [{ }] }] } } } def AddToJson(new_data,jsondata=""): print("jsondata type:", type(jsondata)) if "LogDetails" in jsondata["Job"]["LoggingData"]["Logs"]: print("Joy - Found LogDetails") jsondata["Job"]["LoggingData"]["Logs"]["LogDetails"].append(new_data) else: for sub in jsondata["Job"]["LoggingData"]["Logs"]: print("Value of sub:"+str(sub)) jsondata["Job"]["LoggingData"]["Logs"].append(new_data) return(jsondata) DataToAddToExistingJson = {"Step id": 1, "Step name": "Test"} NewJsonfile =AddToJson(new_data=DataToAddToExistingJson,jsondata=jsonfile) print ("NewJsonfile type:",type(NewJsonfile)) print ("NewJsonfile value:",NewJsonfile)
当前输出
jsondata type: <class 'dict'> Value of sub:{'LogDetails': [{}]} NewJsonfile type: <class 'dict'> NewJsonfile value: {'Job': {'id': '', 'LoggingData': {'Logs': [{'LogDetails': [{}]}, {'Step id': 1, 'Step name': 'Test'}]}}} PS C:\>
期望输出
首次运行后:
{ "Job": { "id": "", "LoggingData": { "Logs": [{ "LogDetails": [{ "Step id": 1, "Step name": "Test" }] }] } } }
后续运行(添加{"Step id": 2, "Step name": "Test"})后:
{ "Job": { "id": "", "LoggingData": { "Logs": [{ "LogDetails": [{ "Step id": 1, "Step name": "Test" }, { "Step id": 2, "Step name": "Test" }] }] } } }
问题原因
代码存在两个关键错误:
jsondata["Job"]["LoggingData"]["Logs"]是列表类型,用"LogDetails" in 该列表的判断逻辑错误——这个判断是检查列表中是否包含字符串"LogDetails",而非列表内的字典元素是否含有LogDetails键,因此永远返回False。- 即使判断通过,
jsondata["Job"]["LoggingData"]["Logs"]["LogDetails"]的写法也错误,因为Logs是列表,必须通过索引(如[0])获取列表内的字典元素后,才能访问LogDetails。
修正后的代码
import json jsonfile = { "Job": { "id": "", "LoggingData": { "Logs":[{ "LogDetails": [{}] }] } } } def AddToJson(new_data, jsondata): # 获取Logs列表中的第一个日志条目字典 log_entry = jsondata["Job"]["LoggingData"]["Logs"][0] # 向LogDetails列表追加新数据 log_entry["LogDetails"].append(new_data) # 可选:移除初始的空字典,让结构更整洁 if len(log_entry["LogDetails"]) > 1 and log_entry["LogDetails"][0] == {}: del log_entry["LogDetails"][0] return jsondata # 首次运行示例 first_data = {"Step id": 1, "Step name": "Test"} result1 = AddToJson(first_data, jsonfile) print("首次运行结果:") print(json.dumps(result1, indent=4)) # 后续运行示例 second_data = {"Step id": 2, "Step name": "Test"} result2 = AddToJson(second_data, result1) print("\n后续运行结果:") print(json.dumps(result2, indent=4))
运行效果
- 首次运行输出与预期完全一致,新元素被追加到
LogDetails列表中。 - 后续运行会继续在
LogDetails列表中追加新元素,不会错误地向Logs列表添加新的字典项。
内容的提问来源于stack exchange,提问作者JonesDK
相关产品推荐
相关产品推荐

