class JsonPath
JsonPath: initializes the class with a given JsonPath
and parses that path into a token array.
Constants
- DEFAULT_OPTIONS
- PATH_ALL
- VERSION
Attributes
path[RW]
Public Class Methods
for(obj_or_str)
click to toggle source
# File lib/jsonpath.rb, line 104 def self.for(obj_or_str) Proxy.new(process_object(obj_or_str)) end
new(path, opts = {})
click to toggle source
# File lib/jsonpath.rb, line 25 def initialize(path, opts = {}) @opts = DEFAULT_OPTIONS.merge(opts) scanner = StringScanner.new(path.strip) @path = [] until scanner.eos? if (token = scanner.scan(/\$\B|@\B|\*|\.\./)) @path << token elsif (token = scanner.scan(/[$@a-zA-Z0-9:{}_-]+/)) @path << "['#{token}']" elsif (token = scanner.scan(/'(.*?)'/)) @path << "[#{token}]" elsif (token = scanner.scan(/\[/)) @path << find_matching_brackets(token, scanner) elsif (token = scanner.scan(/\]/)) raise ArgumentError, 'unmatched closing bracket' elsif (token = scanner.scan(/\(.*\)/)) @path << token elsif scanner.scan(/\./) nil elsif (token = scanner.scan(/[><=] \d+/)) @path.last << token elsif (token = scanner.scan(/./)) begin @path.last << token rescue RuntimeError raise ArgumentError, "character '#{token}' not supported in query" end end end end
on(obj_or_str, path, opts = {})
click to toggle source
# File lib/jsonpath.rb, line 100 def self.on(obj_or_str, path, opts = {}) new(path, opts).on(process_object(obj_or_str)) end
Private Class Methods
process_object(obj_or_str)
click to toggle source
# File lib/jsonpath.rb, line 110 def self.process_object(obj_or_str) obj_or_str.is_a?(String) ? MultiJson.decode(obj_or_str) : obj_or_str end
Public Instance Methods
enum_on(obj_or_str, mode = nil)
click to toggle source
# File lib/jsonpath.rb, line 94 def enum_on(obj_or_str, mode = nil) JsonPath::Enumerable.new(self, self.class.process_object(obj_or_str), mode, @opts) end
Also aliased as: []
find_matching_brackets(token, scanner)
click to toggle source
# File lib/jsonpath.rb, line 56 def find_matching_brackets(token, scanner) count = 1 until count.zero? if (t = scanner.scan(/\[/)) token << t count += 1 elsif (t = scanner.scan(/\]/)) token << t count -= 1 elsif (t = scanner.scan(/[^\[\]]+/)) token << t elsif scanner.eos? raise ArgumentError, 'unclosed bracket' end end token end
first(obj_or_str, *args)
click to toggle source
# File lib/jsonpath.rb, line 90 def first(obj_or_str, *args) enum_on(obj_or_str).first(*args) end
join(join_path)
click to toggle source
# File lib/jsonpath.rb, line 74 def join(join_path) res = deep_clone res.path += JsonPath.new(join_path).path res end
on(obj_or_str, opts = {})
click to toggle source
# File lib/jsonpath.rb, line 80 def on(obj_or_str, opts = {}) a = enum_on(obj_or_str).to_a if opts[:symbolize_keys] a.map! do |e| e.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v; } end end a end
Private Instance Methods
deep_clone()
click to toggle source
# File lib/jsonpath.rb, line 114 def deep_clone Marshal.load Marshal.dump(self) end