You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
                }]
            }]
        }
    }
}

问题原因

代码存在两个关键错误:

  1. jsondata["Job"]["LoggingData"]["Logs"]是列表类型,用"LogDetails" in 该列表的判断逻辑错误——这个判断是检查列表中是否包含字符串"LogDetails",而非列表内的字典元素是否含有LogDetails键,因此永远返回False。
  2. 即使判断通过,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:18:12