22Author : zhangxianbing
33Date : 2020-12-27 09:22:14
44LastEditors : zhangxianbing
5- LastEditTime : 2021-03-02 19:08:30
5+ LastEditTime : 2021-03-02 19:53:38
66Description : JSONPath
77"""
88__version__ = "1.0.4"
@@ -73,6 +73,7 @@ class JSONPath:
7373 )
7474
7575 # annotations
76+ f : list
7677 segments : list
7778 lpath : int
7879 subx = defaultdict (list )
@@ -157,7 +158,7 @@ def _put_paren(self, m):
157158 return self .subx ["#P" ][int (m .group (1 ))]
158159
159160 @staticmethod
160- def _f_brackets (m ):
161+ def _gen_obj (m ):
161162 ret = "__obj"
162163 for e in m .group (1 ).split ("." ):
163164 ret += '["%s"]' % e
@@ -173,26 +174,39 @@ def _traverse(f, obj, i: int, path: str, *args):
173174 f (v , i , f"{ path } { JSONPath .SEP } { k } " , * args )
174175
175176 @staticmethod
176- def _getattr (obj : dict , path : str ):
177+ def _getattr (obj : dict , path : str , * , convert_number_str = False ):
177178 r = obj
178179 for k in path .split ("." ):
179180 try :
180181 r = r .get (k )
181182 except (AttributeError , KeyError ) as err :
182183 logger .error (err )
183184 return None
184-
185+ if convert_number_str and isinstance (r , str ):
186+ try :
187+ if r .isdigit ():
188+ return int (r )
189+ return float (r )
190+ except ValueError :
191+ pass
185192 return r
186193
187194 @staticmethod
188195 def _sorter (obj , sortbys ):
189196 for sortby in sortbys .split ("," )[::- 1 ]:
190197 if sortby .startswith ("~" ):
191198 obj .sort (
192- key = lambda t , k = sortby : JSONPath ._getattr (t [1 ], k [1 :]), reverse = True
199+ key = lambda t , k = sortby : JSONPath ._getattr (
200+ t [1 ], k [1 :], convert_number_str = True
201+ ),
202+ reverse = True ,
193203 )
194204 else :
195- obj .sort (key = lambda t , k = sortby : JSONPath ._getattr (t [1 ], k ))
205+ obj .sort (
206+ key = lambda t , k = sortby : JSONPath ._getattr (
207+ t [1 ], k , convert_number_str = True
208+ )
209+ )
196210
197211 def _filter (self , obj , i : int , path : str , step : str ):
198212 r = False
@@ -263,7 +277,7 @@ def _trace(self, obj, i: int, path):
263277 # filter
264278 if step .startswith ("?(" ) and step .endswith (")" ):
265279 step = step [2 :- 1 ]
266- step = JSONPath .REP_FILTER_CONTENT .sub (self ._f_brackets , step )
280+ step = JSONPath .REP_FILTER_CONTENT .sub (self ._gen_obj , step )
267281 self ._traverse (self ._filter , obj , i + 1 , path , step )
268282 return
269283
0 commit comments