我尝试添加一个元素到一个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"
}]
}]
}
}
}
2条答案
按热度按时间5t7ly7z51#
示例中的
jsondata["Job"]["LoggingData"]["Logs"]
是一个字典列表,因此第一个条件是False
,这就是else起作用并将数据添加到Logs
列表的原因。如果您希望它在您的示例中正常工作,则应按此方式进行检查
那么第一个条件将是
True
,但是如果Logs
是一个空列表,那么它可能会中断(因为您的问题没有明确说明),所以您必须检查它是否存在。20jt8wwn2#
如果您的初始
jsonfile
看起来像这样,这将按预期工作但是,你所拥有的是 *
..."Logs":[{"LogDetails": [{}]}]...
;因此,jsondata["Job"]["LoggingData"]["Logs"]
* 是一个列表(可以使用索引而不是键访问其中的项),因此您不能在其中检查 *"LogDetails"
*,该 *"LogDetails"
* 是字典中的一个键,它是所述列表中的第一项(即,jsondata["Job"]["LoggingData"]["Logs"][0]
)。要将
new_data
添加到Logs
中的第一个字典,您应该将该if
块更改为如果要将
new_data
添加到Logs
中的 last 字典,请使用**...["Logs"][-1]...
**(而不是 *...["Logs"][0]...
*)。[Ofc,如果Logs
只有一个条目,也不会有什么不同。]顺便说一句,您还可以使用
isinstance
和.setdefault
[甚至只使用try...except
]来检查和确保您的数据结构。