清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
# -*- coding: utf-8 -*-
'''
orgin from https://bitbucket.org/k_bx/jquery-unparam
now more json-like struct. make it work with list well!
auther: jhonglei@gmail.com
'''
import re
import urlparse
from itertools import izip_longest
def parse_key_pair(key, val):
groups = re.findall(r"\[.*?\]", key)
groups_joined = ''.join(groups)
if key[-len(groups_joined):] == groups_joined:
key = key[:-len(groups_joined)]
for group in reversed(groups):
index = re.match("\d+", group[1:-1])
if group == '[]':
val = [val]
elif index:
index = int(index.group())
res = [None]*(index+1)
res[index] = val
val = res
else:
val = {group[1:-1]: val}
return {key: val}
def merge_two_structs(s1, s2):
if isinstance(s1, list) and isinstance(s2, list):
new_array =[]
for item,item2 in izip_longest(s1,s2):
if(item):
if(item2):
new_item = merge_two_structs(item,item2)
new_array.append(new_item)
else:
new_array.append(item)
else:
new_array.append(item2)
return new_array
if isinstance(s1, dict) and \
isinstance(s2, dict):
retval = s1.copy()
for key, val in s2.iteritems():
if retval.get(key) is None:
retval[key] = val
else:
retval[key] = merge_two_structs(retval[key], val)
return retval
return s2
def merge_structs(structs):
if len(structs) == 0:
return None
if len(structs) == 1:
return structs[0]
first, rest = structs[0], structs[1:]
return merge_two_structs(first, merge_structs(rest))
def jquery_unparam_unquoted(jquery_params):
pair_strings = jquery_params.split('&')
key_pairs = [parse_key_pair(x) for x in pair_strings]
return merge_structs(key_pairs)
def jquery_unparam(jquery_params):
key_value_pairs= urlparse.parse_qsl(test_str)
struct_list = [parse_key_pair(key, val) for key,val in key_value_pairs]
result = merge_structs(struct_list)
return result
def _part_test1():
##test1
key,val = 'filter[filters][0][value]', 'XXX'
k = parse_key_pair(key,val)
key2,value2 = 'filter[filters][2][operator]', 'TTT'
k2 = parse_key_pair(key2,value2)
##test2
from itertools import izip_longest
a = [1, None, None, {'a':22}]
b = [None, None,2, {'b':11},6,5]
new_array =[]
for item,item2 in izip_longest(a,b):
if(item):
if(item2):
new_item = merge_two_structs(item,item2)
new_array.append(new_item)
else:
new_array.append(item)
else:
new_array.append(item2)
print item,item2
if __name__ == '__main__':
'''
take:2
skip:0
page:1
pageSize:2
sort[0][field]:tKeywords
sort[0][dir]:desc
sort[1][field]:tTitle
sort[1][dir]:asc
filter[logic]:and
filter[filters][0][field]:EmployeeID
filter[filters][0][operator]:eq
filter[filters][0][value]:XXX
group[0][field]:tTitle
group[0][dir]:desc
'''
test_str = "take=2&skip=0&page=1&pageSize=2&sort%5B0%5D%5Bfield%5D=tKeywords&sort%5B0%5D%5Bdir%5D=desc&sort%5B1%5D%5Bfield%5D=tTitle&sort%5B1%5D%5Bdir%5D=asc&filter%5Blogic%5D=and&filter%5Bfilters%5D%5B0%5D%5Bfield%5D=EmployeeID&filter%5Bfilters%5D%5B0%5D%5Boperator%5D=eq&filter%5Bfilters%5D%5B0%5D%5Bvalue%5D=XXX&group%5B0%5D%5Bfield%5D=tTitle&group%5B0%5D%5Bdir%5D=desc"
print jquery_unparam(test_str)
# {'sort': [{'field': 'tKeywords', 'dir': 'desc'}, {'field': 'tTitle', 'dir': 'asc'}], 'group': [{'field': 'tTitle', 'dir': 'desc'}], 'pageSize': '2', 'skip': '0', 'filter': {'filters': [{'operator': 'eq', 'field': 'EmployeeID', 'value': 'XXX'}], 'logic': 'and'}, 'take': '2', 'page': '1'}