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

[](obj_or_str, mode = nil)
Alias for: enum_on
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