我最近在python 3中创建了一个解析器,用于将文件从自定义格式(称为.querty格式)转换为JSON(.json),以便于对其内容进行更轻松的操作。现在我想知道什么是将JSON转换回原始格式并保持其原始结构的最佳方法。
下面是这些文件的示例
example.qwerty
Dict_abc_1{
Dict_abc_2{
HeaderGUID="";
Version_TPI="999";
EncryptionType="0";
}
Dict_abc_3{
FamilyName="John Doe";
}
Dict_abc_4{
Array_abc{
{TimeStamp="2018-11-07 01:00:00"; otherinfo="";}
{TimeStamp="2018-11-07 01:00:00"; otherinfo="";}
{TimeStamp="2018-11-07 01:00:00"; otherinfo="";}
{TimeStamp="2018-11-07 02:53:57"; otherinfo="";}
{TimeStamp="2018-11-07 02:53:57"; otherinfo="";}
}
Dict_abc_5{
LastContact="2018-11-08 01:00:00";
BatteryStatus=99;
BUStatus=PowerOn;
LastCallTime="2018-11-08 01:12:46";
LastSuccessPoll="2018-11-08 01:12:46";
CallResult=Successful;
}
}
}
Code=999999;
example.json
{
"Dict_abc_1":{
"Dict_abc_2":{
"HeaderGUID":"",
"Version_TPI":"999",
"EncryptionType":"0"
},
"Dict_abc_3":{
"FamilyName":"John Doe"
},
"Dict_abc_4":{
"Array_abc":[
{"TimeStamp":"2018-11-07 01:00:00", "otherinfo":""},
{"TimeStamp":"2018-11-07 01:00:00", "otherinfo":""},
{"TimeStamp":"2018-11-07 01:00:00", "otherinfo":""},
{"TimeStamp":"2018-11-07 02:53:57", "otherinfo":""},
{"TimeStamp":"2018-11-07 02:53:57", "otherinfo":""}
],
"Dict_abc_5":{
"LastContact":"2018-11-08 01:00:00",
"BatteryStatus":99,
"BUStatus":"PowerOn",
"LastCallTime":"2018-11-08 01:12:46",
"LastSuccessPoll":"2018-11-08 01:12:46",
"CallResult":"Successful"
}
}
},
"Code":999999
}
.qwerty的结构定义不同于json
由于我目前对.json的.qwerty解析器使用词法和句法分析。我认为没有必要使用此方法重新创建另一个解析器,因为数据现在处于非常可操作的形式(json)。我想知道扩展json.dumps以适应我的新定义是否是一个好主意,但不知道从哪里开始或是否有可能。
我正在尝试以一种有效的方式进行操作,非常感谢您的想法或方法,谢谢。
答案 0 :(得分:1)
由于语法看起来相对简单,因此您可以不用使用词法和句法分析就可以摆脱困境。相反,您可以使用一些正则表达式来识别您的数组/字典和变量,然后只需使用简单的替换就可以相应地修改格式。
答案 1 :(得分:1)
我认为可以用一种蛮力的方式工作,尽管我尚未对其进行任何测试。一个明显的困难点是列表,因为如果列表除了字典以外还可以包含其他任何内容,那么此代码段将不起作用。您可能必须修改代码的这一部分-或如果列表中dict的内容不必全部放在一行上,则也可以使它递归运行。但是无论如何,希望这为您进行实验提供了一个良好的开端。
这是一个递归函数。三个输入:要解析的字典,要写入的文件以及当前的缩进级别。
def print_qwerty(json_dict, file_descriptor, indent_level=0):
for (k, v) in json_dict.items():
if type(v) == dict:
file_descriptor.write(' '*indent_level + k + '{\n')
print_qwerty(v, file_descriptor, indent_level + 1)
file_descriptor.write(' '*indent_level + ';}\n')
elif type(v) == list:
for i in v:
args_str = ['{}="{}"'.format(k2,v2) for (k2, v2) in i.items()]
file_descriptor.write(' '*indent_level + '{' + '; '.join(args_str) + '}\n')
else:
file_descriptor.write(' '*indent_level + '{}="{}";\n'.format(k, v))
用法示例:
import json
with open('example.json', 'r') as json_file:
json_dict = json.loads(json_file.read())
with open('example.qwerty', 'w') as 'qwerty_file':
print_qwerty(json_dict, qwerty_file)