/JsonExtractor

Pan JSON format data extractor, based on the stack and the regular extraction of JSON specified level key value/泛JSON格式数据抽取器,基于栈和正则抽取JSON中指定层级key的value

Primary LanguageJava

March 2 2017 7:58 AM

JsonExtractor


function/系统功能

Pan JSON format data extractor, based on the stack and the regular extraction of JSON specified level key value

泛JSON格式数据抽取器,基于栈和正则抽取JSON中指定层级key的value

Introduction/介绍

包含三种匹配模式:完整匹配、精确匹配、模糊匹配
   (注:1、精确匹配、模糊匹配在内部均转化为完整匹配进行抽取
       2、规则中 # 号前面代表key,后面代表其所在当前层级,两层key规则之间用 - 连接)
   下面均以例子< 在{A:{B:[C1:"X", C2:"Y"], D:"", C3:""}, E:………}中匹配 X和Y,其中二者父层C1和C2同名 >来说明匹配模式
   完整匹配:给定待匹配数据和目标key及其对应括号层级的匹配规则(即所在的括号层数,包括中括号[]和大括号{}),返回匹配结果列表。
       上述C1和C2当前处于第三层括号中,所以可用的匹配规则有:A#1-B#1-C#1 , C#3 , A#1-C#2 , B#2-C#1 , A#1-C#0
   精确匹配:给定待匹配数据和目标key对应的精确规则,返回匹配结果列表。
       针对上例,精确规则为:A-B-C,内部自动转化为精确完整规则:A#1-B#1-C#1 进行匹配,所以实际是对精确完整规则的简化
   模糊匹配:给定待匹配数据和目标key对应的模糊规则,返回匹配结果列表。
       针对上例,模糊规则为:A-C,内部自动转化为模糊完整规则:A#0-C#0 进行匹配,不推荐使用,无法准确抽取
   (注:
       1、规则中下一个key的层级是在上一个key的value中对应的层级,即B处于整体第二层级时,单独抽取用规则 B#2,
           先抽取A时规则为 A#1-B#1,即第一步抽取完A后,当前B处于A的value中第一层;
       2、上述 A#1-B#1-C#1 为精确完整规则,即指定每一括号层级的key;
       3、上述 A#1-C#0 为模糊完整规则,当key的层级指定0时表示不限制层级,将匹配当前所有层级下的key,
           精确匹配到A后模糊匹配C,即当匹配到A后,在A中不限制层级匹配C,注意,当规则为 C#0 时,将匹配到C1、C2、C3,不符合要求;
          当目标要匹配C3时,则仅用模糊规则无法准确匹配,模糊规则A#0-C#0将匹配到C1、C2、C3
       4、上述 其余规则为普通规则,即指定部分括号层级的key;
       3、当规则为 C#3 时仅匹配C1和C2,因为C3处于整体的第二层,所以不匹配
       4、当规则为 A#1-C#2 时仅匹配C1和C2,因为第一步匹配整体第一层的A后,C3处于当前第一层
       5、之所以返回匹配结果列表,是因为当父层有列表结构时,json同一层级下可能包含同名的key,如上述情况
           目标key为第三层的C1和C2,因为B对应的value是个列表,所以C1和C2同名且在同一层级下
       6、返回结果有两种格式,1、指定key对应的所有key:value完整数据,2、指定key对应的value(当key对应最后一层时)
           例如当规则为 B#2 时返回 B:[C1:"", C2:""]; 当规则为 B#2-C#1 时返回 X和Y
       7、列表特例:当为{A:{B:[{C1:""}, {C2:""}], D:""}, E:………}时,完整规则为A#1-B#1-C#2,虽然B下一个key是C,但由于其间有中括号
           所以C位于B下两层,也可用精确规则:A-B-[]-C,模糊规则:A-B-C
       8、利用栈检测json格式的字符串中括号的匹配情况来进行指定层级key的识别,目前发现的所有不标准JSON格式均可正确抽取,包括括号缺失、JSON内部出错等
       
       ***9、推荐仅使用 完整匹配 和 精确匹配,不推荐模糊匹配。精确匹配仅为了能准确定位的时候简化规则,模糊匹配为了兼容之前收集的规则和测试的时候节约时间
   )

examples/使用范例

    DataPretreat dp = new DataPretreat();
    String original_data = encode_test.readAbsFileToStringUtf8("/Users/zouxinyi/test");
    System.out.println(original_data.length());
    System.out.println(dp.complete_rule_match(original_data, "gallery#1-abstract#2"));

contact/联系方式

609610350@qq.com