Sha256: d039b20e248e02e63e42180c0203a7d3d815f16999853deb223ad3bc86543a2c

Contents?: true

Size: 1.73 KB

Versions: 33

Compression:

Stored size: 1.73 KB

Contents

require 'jsonpath'

module Krikri
  ##
  # JsonParser
  # @see Krikri::Parser
  class JsonParser < Krikri::Parser
    ##
    # @param record [Krikri::OriginalRecord] a record whose properties can
    # be parsed by the parser instance.
    # @param root_path [String] JsonPath that identifies the root path for
    # the desired parse root.
    # @see http://goessner.net/articles/JsonPath/ JsonPath
    def initialize(record, root_path = '$')
      @root = Value.new(JsonPath.on(record.content, root_path).first)
      super(record)
    end

    ##
    # JsonParser::Value
    # @see Krikri::Parser::Value
    class Value < Krikri::Parser::Value
      attr_accessor :node

      def initialize(node)
        @node = node
      end

      def attributes
        raise NotImplementedError, 'Attributes are not supported for JSON'
      end

      def children
        @node.is_a?(Hash) ? @node.keys : []
      end

      def value
        @node.is_a?(Hash) ? nil : @node
      end

      def values?
        !select_values.empty?
      end

      private

      ##
      # @see Krikri::Parser#get_child_nodes
      #
      # @param name_exp [String]  Object property name
      # @return [Krikri::Parser::ValueArray]
      def get_child_nodes(name)
        if @node[name].is_a?(Array)
          vals = @node[name].map { |node| self.class.new(node) }
        else
          vals = Array(self.class.new(@node[name]))
        end
        vals.reject! { |n| n.node.nil? }
        Krikri::Parser::ValueArray.new(vals)
      end

      def attribute(name)
        msg = "Attributes are not supported for JSON; got attribute `#{name}`"
        raise NotImplementedError, msg
      end

      def select_values
        @node.is_a?(Hash) ? [] : @node
      end
    end
  end
end

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
krikri-0.14.0 lib/krikri/parsers/json_parser.rb
krikri-0.13.2 lib/krikri/parsers/json_parser.rb
krikri-0.13.1 lib/krikri/parsers/json_parser.rb
krikri-0.13.0 lib/krikri/parsers/json_parser.rb
krikri-0.12.4 lib/krikri/parsers/json_parser.rb
krikri-0.12.3 lib/krikri/parsers/json_parser.rb
krikri-0.12.1 lib/krikri/parsers/json_parser.rb
krikri-0.12.0 lib/krikri/parsers/json_parser.rb
krikri-0.12.0.pre.rc.1 lib/krikri/parsers/json_parser.rb
krikri-0.11.2 lib/krikri/parsers/json_parser.rb
krikri-0.11.1 lib/krikri/parsers/json_parser.rb
krikri-0.11.0 lib/krikri/parsers/json_parser.rb
krikri-0.10.1 lib/krikri/parsers/json_parser.rb
krikri-0.10.0 lib/krikri/parsers/json_parser.rb
krikri-0.9.0 lib/krikri/parsers/json_parser.rb
krikri-0.8.9 lib/krikri/parsers/json_parser.rb
krikri-0.8.8 lib/krikri/parsers/json_parser.rb
krikri-0.8.7 lib/krikri/parsers/json_parser.rb
krikri-0.8.6 lib/krikri/parsers/json_parser.rb
krikri-0.8.5 lib/krikri/parsers/json_parser.rb