自定义文件将python json映射到自定义

时间:2018-11-19 03:22:09

标签: python json parsing

我最近在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以适应我的新定义是否是一个好主意,但不知道从哪里开始或是否有可能。

我正在尝试以一种有效的方式进行操作,非常感谢您的想法或方法,谢谢。

2 个答案:

答案 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)