# JSON::Path [![Build Status](https://travis-ci.org/jnthn/json-path.svg?branch=master)](https://travis-ci.org/jnthn/json-path)

The [JSONPath query language](https://goessner.net/articles/JsonPath/) was
designed for indexing into JSON documents. It plays the same role as XPath
does for XML documents.

This module implements `JSON::Path`. However, it is not restricted to working
on JSON input. In fact, it will happily work over any data structure made up of
arrays and hashes.

## Synopsis

    # Example data.
    my $data = {
        kitchen => {
            drawers => [
                { knife => '����' },
                { glass => '����' },
                { knife => '�������' },
            ]
        }
    };

    # A query
    my $jp = JSON::Path.new('$.kitchen.drawers[*].knife');

    # The first result
    dd $jp.value($data);    # "����"

    # All results.
    dd $jp.values($data);   # ("����", "�������").Seq

    # All paths where the results were found.
    dd $jp.paths($data);    # ("\$.kitchen.drawers[0].knife",
                            #  "\$.kitchen.drawers[2].knife").Seq

    # Interleaved paths and values.
    dd $jp.paths-and-values($data); # ("\$.kitchen.drawers[0].knife", "����",
                                    #  "\$.kitchen.drawers[2].knife", "�������").Seq

## Query Syntax Summary

The following syntax is supported:

    $           root node
    .key        index hash key
    ['key']     index hash key
    [2]         index array element
    [0,1]       index array slice
    [4:5]       index array range
    [:5]        index from the beginning
    [-3:]       index to the end
    .*          index all elements
    [*]         index all elements
    [?(expr)]   filter on (Perl 6) expression
    ..key       search all descendants for hash key

A query that is not rooted from `$` or specified using `..` will be evaluated
from the document root (that is, same as an explicit `$` at the start).