Json键值与文本文件属性匹配-Python
我有一个巨大的json文件,格式如下,我想加密特定标记中的特定值,而不必硬编码密钥或属性名称。但我无法用json映射文本值。有人能帮我解决这个问题吗Json键值与文本文件属性匹配-Python,python,json,encryption,Python,Json,Encryption,我有一个巨大的json文件,格式如下,我想加密特定标记中的特定值,而不必硬编码密钥或属性名称。但我无法用json映射文本值。有人能帮我解决这个问题吗 Output.txt { "layer1": [ { "name": "abc", "element": "Ether Element&q
Output.txt
{
"layer1": [
{
"name": "abc",
"element": "Ether Element",
"inter": "Intrawork"
},
{
"desc": "Some random desc",
"name": "cdf",
}
],
"layer2": [
{
"cs": 12,
"Policy": "VODAFONED2GMBH48491-G0/3/1:10-NTE-INGRESS",
"class": "class-default"
}
]
}
Encrypt.txt
layer1 name
layer2 class
layer2 Policy
代码:
因此,基本上您希望从Encrypt.txt读取json的密钥,其中字符串需要加密。 理论上: 对于每一行标记,我们尽可能深入地研究每个标记。如果我们所在的当前层恰好是一个数组,我们将进入每个数组元素,然后再次尽可能深入,直到到达当前行的最后一个标记。要么我们到达我们想要的标签,要么沿途某个地方没有标签,我们忽略了这个情况 此逻辑可以像这样递归完成:
导入json
导入hashlib
def加密(层,行,i=0):
尝试:
如果i==len(行)-1:
如果类型(图层)为列表:
对于层中的条目:
条目[row[i]]=hashlib.sha256(条目[row[i]].encode('utf-8')).hexdigest()
其他:
layer[row[i]]=hashlib.sha256(layer[row[i]].encode('utf-8')).hexdigest()
返回
如果类型(图层)为列表:
对于层中的条目:
加密(条目[行[i]],行,i+1)
其他:
加密(层[行[i]],行,i+1)
除:
通过
行=[]
将open('Encrypt.txt','r')作为f:
对于f中的行:
行=行。拆分()
第[0]行=str(第[0]行)
第[1]行=str(第[1]行)
行。追加(行)
将open(“my json.json”,“r+”)作为json_文件:
d=json.load(json_文件)
对于行中的行:
加密(d行)
将open('output_encrypted.txt',“w”)作为json_文件:
dump(d,json_文件,缩进=4)
在这里,您可以看到在encrypt函数中完成了递归。在那里,我们首先传递字典(或json)和当前行数组,然后根据当前访问的层是否是数组,再次调用下一层或多层的函数。
最初的try-except是为了避免不存在的条目破坏我们的代码
例如,如果您的json要这样修改:
{
"layer1": [
{
"name": "abc",
"element": "Ether Element",
"inter": "Intrawork"
},
{
"desc": "Some random desc",
"name": "cdf"
},
{
"desc": "Some other random desc"
}
],
"layer2": [
{
"cs": 12,
"Policy": "VODAFONED2GMBH48491-G0/3/1:10-NTE-INGRESS",
"class": "class-default"
}
]
}
如果不使用try/except,代码将导致错误。当然,如果需要,可以用appropiate if语句替换
旁注:这里的“encrypt”一词应该重命名为“encode”(散列是一种编码形式,而不是加密)
{
"layer1": [
{
"name": "abc",
"element": "Ether Element",
"inter": "Intrawork"
},
{
"desc": "Some random desc",
"name": "cdf"
},
{
"desc": "Some other random desc"
}
],
"layer2": [
{
"cs": 12,
"Policy": "VODAFONED2GMBH48491-G0/3/1:10-NTE-INGRESS",
"class": "class-default"
}
]
}