22Author : zhangxianbing1
33Date : 2020-12-27 09:22:14
44LastEditors : zhangxianbing1
5- LastEditTime : 2020-12-31 18:14:16
5+ LastEditTime : 2021-01-04 09:59:44
66Description : JSONPath
77"""
88__version__ = "1.0.0"
@@ -153,64 +153,64 @@ def _filter(self, obj, istep: int, step):
153153 if r :
154154 self ._trace (obj , istep )
155155
156- def _trace (self , obj , istep : int ):
156+ def _trace (self , obj , i : int ):
157157 """Perform operation on object.
158158
159159 Args:
160160 obj ([type]): current operating object
161- istep (int): current operation specified by index in self.steps
161+ i (int): current operation specified by index in self.steps
162162 """
163163
164164 # store
165- if istep >= self .lpath :
165+ if i >= self .lpath :
166166 self .result .append (obj )
167167 print (obj )
168168 return
169169
170- step = self .steps [istep ]
170+ step = self .steps [i ]
171171
172172 # wildcard
173173 if step == "*" :
174- self ._traverse (self ._trace , obj , istep + 1 )
174+ self ._traverse (self ._trace , obj , i + 1 )
175175 return
176176
177177 # recursive descent
178178 if step == ".." :
179- self ._trace (obj , istep + 1 )
180- self ._traverse (self ._trace , obj , istep )
179+ self ._trace (obj , i + 1 )
180+ self ._traverse (self ._trace , obj , i )
181181 return
182182
183183 # get value from list
184184 if isinstance (obj , list ) and step .isdigit ():
185185 ikey = int (step )
186186 if ikey < len (obj ):
187- self ._trace (obj [ikey ], istep + 1 )
187+ self ._trace (obj [ikey ], i + 1 )
188188 return
189189
190190 # get value from dict
191191 if isinstance (obj , dict ) and step in obj :
192- self ._trace (obj [step ], istep + 1 )
192+ self ._trace (obj [step ], i + 1 )
193193 return
194194
195195 # slice
196196 if isinstance (obj , list ) and REP_SLICE_CONTENT .fullmatch (step ):
197197 vals = eval (f"obj[{ step } ]" )
198198 for v in vals :
199- self ._trace (v , istep + 1 )
199+ self ._trace (v , i + 1 )
200200 return
201201
202202 # select
203203 if isinstance (obj , dict ) and REP_SELECT_CONTENT .fullmatch (step ):
204204 for k in step .split ("," ):
205205 if k in obj :
206- self ._trace (obj [k ], istep + 1 )
206+ self ._trace (obj [k ], i + 1 )
207207 return
208208
209209 # filter
210210 if step .startswith ("?(" ) and step .endswith (")" ):
211211 step = step [2 :- 1 ]
212212 step = REP_FILTER_CONTENT .sub (self ._f_brackets , step )
213- self ._traverse (self ._filter , obj , istep + 1 , step )
213+ self ._traverse (self ._filter , obj , i + 1 , step )
214214 return
215215
216216 # sort
@@ -225,16 +225,11 @@ def _trace(self, obj, istep: int):
225225 else :
226226 obj .sort (key = lambda t , k = sortby : _getattr (t , k ))
227227
228- self ._traverse (self ._trace , obj , istep + 1 )
228+ self ._traverse (self ._trace , obj , i + 1 )
229229 return
230230
231231
232232if __name__ == "__main__" :
233- # JSONPath("$.a.'b.c'.'d e'.[f,g][h][*][j.k][l m][2:4]..d", result_type="FIELD")
234233 with open ("test/data/2.json" , "rb" ) as f :
235234 d = json .load (f )
236- # JSONPath(
237- # '$.book[?(@.title=="Herman Melville" or @.title=="Evelyn Waugh")].title'
238- # ).parse(d)
239- # JSONPath("$..price").parse(d)
240235 JSONPath ("$.book[/(price)].price" ).parse (d )
0 commit comments