Skip to content

Commit 8712e4c

Browse files
committed
fix: fix sorter by number string
1 parent dffc739 commit 8712e4c

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

jsonpath/__init__.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Author : zhangxianbing
33
Date : 2020-12-27 09:22:14
44
LastEditors : zhangxianbing
5-
LastEditTime : 2021-03-02 19:08:30
5+
LastEditTime : 2021-03-02 19:53:38
66
Description : 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

Comments
 (0)