summaryrefslogtreecommitdiff
path: root/jsonpath_rw/bin/jsonpath.py
diff options
context:
space:
mode:
Diffstat (limited to 'jsonpath_rw/bin/jsonpath.py')
-rwxr-xr-xjsonpath_rw/bin/jsonpath.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/jsonpath_rw/bin/jsonpath.py b/jsonpath_rw/bin/jsonpath.py
new file mode 100755
index 0000000..364615f
--- /dev/null
+++ b/jsonpath_rw/bin/jsonpath.py
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+# encoding: utf-8
+# Copyright © 2012 Felix Richter <wtfpl@syntax-fehler.de>
+# This work is free. You can redistribute it and/or modify it under the
+# terms of the Do What The Fuck You Want To Public License, Version 2,
+# as published by Sam Hocevar. See the COPYING file for more details.
+
+from jsonpath_rw import parse
+import json
+import sys
+import glob
+if len(sys.argv) < 2:
+ print("""usage: jsonpath.py expression [files]
+
+The expression is JSONPath and can be:
+
+ atomics:
+ $ - root object
+ `this` - current object
+
+ operators:
+ path1.path2 - same as xpath /
+ path1|path2 - union
+ path1..path2 - somewhere in between
+
+ fiels:
+ fieldname - field with name
+ * - any field
+ [_start_?:_end_?] - array slice
+ [*] - any array index
+""")
+ sys.exit(1)
+
+expr = parse(sys.argv[1])
+
+def find_matches_for_file(f):
+ return [unicode(match.value) for match in expr.find(json.load(f))]
+
+def print_matches(matches):
+ print(u"\n".join(matches).encode("utf-8"))
+
+if len(sys.argv) < 3:
+ # stdin mode
+ print_matches(find_matches_for_file(sys.stdin))
+else:
+ # file paths mode
+ for pattern in sys.argv[2:]:
+ for filename in glob.glob(pattern):
+ with open(filename) as f:
+ print_matches(find_matches_for_file(f))
+