[英]Replace json value, and then save into new file
是的,有很多关于这个主题的例子......而且解决方案也是一样的。 但我不明白如何将替换的值分配回“数据”。 它似乎对其他人有用。
我已经指出了应该在“Json”下方更改的地方,“111”应该更新为“[7777777, 7777777, 7777777, 7777777, 7777777, 7777777,7777777]”。
我猜当我使用 json.dump(data, f) 进入新文件时,这里的“数据”在我加载时仍然是相同的数据,但我想我已经替换了? 所以可以再次将 json 转储到新文件中。
import json
import re
p7 = ['[7777777, 7777777, 7777777, 7777777, 7777777, 7777777 ,7777777]', '[6666666, 6666666, 6666666, 6666666, 6666666, 6666666, 6666666]', '[4444444, 4444444, 4444444, 4444444, 4444444, 4444444, 4444444]', '[1111111, 1111111, 1111111, 1111111, 1111111, 1111111, 1111111]', '[2222222, 2222222, 2222222, 2222222, 2222222, 2222222, 2222222]']
p6 = ['3333333, 3333333, 3333333, 3333333, 3333333, 3333333']
p5 = ['5555555, 5555555, 5555555, 5555555, 5555555, 5555555']
p2 = ['2121211', '3434343']
# Opening JSON file
with open('Template.json') as f:
data = json.load(f)
rec1 = '111'
for i in data['setting']['rule']['jsonLogic']['merge'][0]['if'][1]:
print(i)
i = str(i).replace(rec1, str(p7[0]))
print(i)
with open('new_data.json', 'w') as f:
json.dump(data, f)
Json:
{
"serviceType": "Normal",
"setting": {
"settingName": "TEST",
"settingDesc": "TEST",
"settingType": "JsonLogic",
"productIds": "uniquethings",
"title": null,
"description": "",
"rule": {
"attrs": {
"maxResults": "10"
},
"jsonLogic": {
"merge": [{
"if": [{
"and": [{
">=": [{
"var": "t1"
},
{
"var": "t2"
}
]
},
{
">=": [{
"var": "t1"
},
{
"var": "t3"
}
]
},
{
">=": [{
"var": "t4"
},
{
"var": "t2"
}
]
},
{
">=": [{
"var": "t4"
},
{
"var": "t3"
}
]
}
]
},
[
111 #This should be changed to [7777777, 7777777, 7777777, 7777777,
7777777, 7777777 ,7777777] in new file
],
{
"and": [{
">=": [{
"var": "t1"
},
{
"var": "t4"
}
]
},
{
">=": [{
"var": "t1"
},
{
"var": "t3"
}
]
},
{
">=": [{
"var": "t2"
},
{
"var": "t4"
}
]
},
{
">=": [{
"var": "t2"
},
{
"var": "t3"
}
]
}
]
},
[
222
],
{
"and": [{
">=": [{
"var": "t1"
},
{
"var": "t4"
}
]
},
{
">=": [{
"var": "t1"
},
{
"var": "t2"
}
]
},
{
">=": [{
"var": "t3"
},
{
"var": "t4"
}
]
},
{
">=": [{
"var": "t3"
},
{
"var": "t2"
}
]
}
]
},
[
333
],
{
"and": [{
">=": [{
"var": "t4"
},
{
"var": "t1"
}
]
},
{
">=": [{
"var": "t4"
},
{
"var": "t3"
}
]
},
{
">=": [{
"var": "t2"
},
{
"var": "t1"
}
]
},
{
">=": [{
"var": "t2"
},
{
"var": "t3"
}
]
}
]
},
[
444
],
{
"and": [{
">=": [{
"var": "t4"
},
{
"var": "t1"
}
]
},
{
">=": [{
"var": "t4"
},
{
"var": "t2"
}
]
},
{
">=": [{
"var": "t3"
},
{
"var": "t1"
}
]
},
{
">=": [{
"var": "t3"
},
{
"var": "t2"
}
]
}
]
},
[
555
],
[
666
]
]
},
{
"if": [{
">=": [{
"var": "t5"
},
{
"var": "t6"
}
]
},
[
777
],
[
888
]
]
}
]
}
}
},
"customerId": 999999999
}
当你说...
for i in data['setting']['rule']['jsonLogic']['merge'][0]['if'][1]:
... i
对data['setting']['rule']['jsonLogic']['merge'][0]['if'][1]
列表的值进行连续复制而不是引用.
所以语句i = str(i).replace(rec1, str(p7[0]))
只是将i
设置为替换字符串,但您尚未设置data['setting']['rule']['jsonLogic']['merge'][0]['if'][1][0]
到替换字符串,这就是你需要做的。 而且您不需要 for 循环,因为您要替换的只有一个元素。 因此,正如@Ynjxsjmh 评论的那样,您所需要的只是:
data['setting']['rule']['jsonLogic']['merge'][0]['if'][1][0] = p7[0]
这是因为您知道rec1
是'111'
, str(111)
仍然是'111'
并且我们知道str(i)
的值也是'111'
。 和str(p7[0]) == p7[0])
。 所以我们将用p7[0]
替换整个字符串。 但是您真的希望这是一个字符串还是一个列表,正如您的 JSON 字符串所暗示的那样?
如果列表中可能有多个元素并且您需要替换所有出现的地方,那么一种方法是:
for i in range(len(data['setting']['rule']['jsonLogic']['merge'][0]['if'][1])):
data['setting']['rule']['jsonLogic']['merge'][0]['if'][1][i] = p7[0]
变量i
用于表示索引而不是列表的元素,通常是惯例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.