json 巨蟒-杰森:附加元素

tuwxkamq  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(80)

我尝试添加一个元素到一个json文件,但我可以添加到文件的级别4(LogDetails),然而,它适用于级别3(Logs)。
我是Python的新手,我似乎可以解决这个问题,有人能帮忙吗?:-)

import json

#Normaly loaded from a json file, but inserted here to make the exampel more simple - i hope :)
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:\>

我本以为它会找到名为LogDetails的dict的最低层,但它似乎忽略了它。
第一次运行所需输出:

{
    "Job": {
        "id": "",
        "LoggingData": {
            "Logs": [{
                "LogDetails": [{
                    "Step id": 1,
                    "Step name": "Test"
                }]
            }]
        }
    }
}

然后是这样的

{
    "Job": {
        "id": "",
        "LoggingData": {
            "Logs": [{
                "LogDetails": [{
                    "Step id": 1,
                    "Step name": "Test"
                }, {
                    "Step id": 2,
                    "Step name": "Test"
                }]
            }]
        }
    }
}
5t7ly7z5

5t7ly7z51#

示例中的jsondata["Job"]["LoggingData"]["Logs"]是一个字典列表,因此第一个条件是False,这就是else起作用并将数据添加到Logs列表的原因。
如果您希望它在您的示例中正常工作,则应按此方式进行检查

if "LogDetails" in jsondata["Job"]["LoggingData"]["Logs"][0]:
    ...

那么第一个条件将是True,但是如果Logs是一个空列表,那么它可能会中断(因为您的问题没有明确说明),所以您必须检查它是否存在。

20jt8wwn

20jt8wwn2#

if "LogDetails" in jsondata["Job"]["LoggingData"]["Logs"]:
        jsondata["Job"]["LoggingData"]["Logs"]["LogDetails"].append(new_data)

如果您的初始jsonfile看起来像这样,这将按预期工作

jsonfile = {
    "Job": {
        "id": "",
        "LoggingData": {
            "Logs":{"LogDetails": [{}]} ## NOT [{"LogDetails": [{}]}]
        }
    }
}

但是,你所拥有的是 * ..."Logs":[{"LogDetails": [{}]}]...;因此,jsondata["Job"]["LoggingData"]["Logs"] * 是一个列表(可以使用索引而不是键访问其中的项),因此您不能在其中检查 * "LogDetails" *,该 * "LogDetails" * 是字典中的一个,它是所述列表中的第一项(即,jsondata["Job"]["LoggingData"]["Logs"][0])。
要将new_data添加到Logs中的第一个字典,您应该将该if块更改为

if "LogDetails" in jsondata["Job"]["LoggingData"]["Logs"][0]:
        print("Joy - Found LogDetails") 
        jsondata["Job"]["LoggingData"]["Logs"][0]["LogDetails"].append(new_data)

如果要将new_data添加到Logs中的 last 字典,请使用**...["Logs"][-1]...**(而不是 * ...["Logs"][0]... *)。[Ofc,如果Logs只有一个条目,也不会有什么不同。]
顺便说一句,您还可以使用isinstance.setdefault [甚至只使用try...except]来检查和确保您的数据结构。

相关问题