1 | package Mojo::JSON::Pointer;
|
---|
2 | use Mojo::Base -base;
|
---|
3 |
|
---|
4 | has 'data';
|
---|
5 |
|
---|
6 | sub contains { shift->_pointer(1, @_) }
|
---|
7 | sub get { shift->_pointer(0, @_) }
|
---|
8 |
|
---|
9 | sub new { @_ > 1 ? shift->SUPER::new(data => shift) : shift->SUPER::new }
|
---|
10 |
|
---|
11 | sub _pointer {
|
---|
12 | my ($self, $contains, $pointer) = @_;
|
---|
13 |
|
---|
14 | my $data = $self->data;
|
---|
15 | return $contains ? 1 : $data unless $pointer =~ s!^/!!;
|
---|
16 | for my $p (length $pointer ? (split '/', $pointer, -1) : ($pointer)) {
|
---|
17 | $p =~ s!~1!/!g;
|
---|
18 | $p =~ s/~0/~/g;
|
---|
19 |
|
---|
20 | # Hash
|
---|
21 | if (ref $data eq 'HASH' && exists $data->{$p}) { $data = $data->{$p} }
|
---|
22 |
|
---|
23 | # Array
|
---|
24 | elsif (ref $data eq 'ARRAY' && $p =~ /^\d+$/ && @$data > $p) {
|
---|
25 | $data = $data->[$p];
|
---|
26 | }
|
---|
27 |
|
---|
28 | # Nothing
|
---|
29 | else { return undef }
|
---|
30 | }
|
---|
31 |
|
---|
32 | return $contains ? 1 : $data;
|
---|
33 | }
|
---|
34 |
|
---|
35 | 1;
|
---|
36 |
|
---|
37 | =encoding utf8
|
---|
38 |
|
---|
39 | =head1 NAME
|
---|
40 |
|
---|
41 | Mojo::JSON::Pointer - JSON Pointers
|
---|
42 |
|
---|
43 | =head1 SYNOPSIS
|
---|
44 |
|
---|
45 | use Mojo::JSON::Pointer;
|
---|
46 |
|
---|
47 | my $pointer = Mojo::JSON::Pointer->new({foo => [23, 'bar']});
|
---|
48 | say $pointer->get('/foo/1');
|
---|
49 | say 'Contains "/foo".' if $pointer->contains('/foo');
|
---|
50 |
|
---|
51 | =head1 DESCRIPTION
|
---|
52 |
|
---|
53 | L<Mojo::JSON::Pointer> is an implementation of
|
---|
54 | L<RFC 6901|http://tools.ietf.org/html/rfc6901>.
|
---|
55 |
|
---|
56 | =head1 ATTRIBUTES
|
---|
57 |
|
---|
58 | L<Mojo::JSON::Pointer> implements the following attributes.
|
---|
59 |
|
---|
60 | =head2 data
|
---|
61 |
|
---|
62 | my $data = $pointer->data;
|
---|
63 | $pointer = $pointer->data({foo => 'bar'});
|
---|
64 |
|
---|
65 | Data structure to be processed.
|
---|
66 |
|
---|
67 | =head1 METHODS
|
---|
68 |
|
---|
69 | L<Mojo::JSON::Pointer> inherits all methods from L<Mojo::Base> and implements
|
---|
70 | the following new ones.
|
---|
71 |
|
---|
72 | =head2 contains
|
---|
73 |
|
---|
74 | my $bool = $pointer->contains('/foo/1');
|
---|
75 |
|
---|
76 | Check if L</"data"> contains a value that can be identified with the given JSON
|
---|
77 | Pointer.
|
---|
78 |
|
---|
79 | # True
|
---|
80 | Mojo::JSON::Pointer->new('just a string')->contains('');
|
---|
81 | Mojo::JSON::Pointer->new({'â¥' => 'mojolicious'})->contains('/â¥');
|
---|
82 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/foo');
|
---|
83 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/1');
|
---|
84 |
|
---|
85 | # False
|
---|
86 | Mojo::JSON::Pointer->new({'â¥' => 'mojolicious'})->contains('/â');
|
---|
87 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/bar');
|
---|
88 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/9');
|
---|
89 |
|
---|
90 | =head2 get
|
---|
91 |
|
---|
92 | my $value = $pointer->get('/foo/bar');
|
---|
93 |
|
---|
94 | Extract value from L</"data"> identified by the given JSON Pointer.
|
---|
95 |
|
---|
96 | # "just a string"
|
---|
97 | Mojo::JSON::Pointer->new('just a string')->get('');
|
---|
98 |
|
---|
99 | # "mojolicious"
|
---|
100 | Mojo::JSON::Pointer->new({'â¥' => 'mojolicious'})->get('/â¥');
|
---|
101 |
|
---|
102 | # "bar"
|
---|
103 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/foo');
|
---|
104 |
|
---|
105 | # "4"
|
---|
106 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/0');
|
---|
107 |
|
---|
108 | # "6"
|
---|
109 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/2');
|
---|
110 |
|
---|
111 | =head2 new
|
---|
112 |
|
---|
113 | my $pointer = Mojo::JSON::Pointer->new;
|
---|
114 | my $pointer = Mojo::JSON::Pointer->new({foo => 'bar'});
|
---|
115 |
|
---|
116 | Build new L<Mojo::JSON::Pointer> object.
|
---|
117 |
|
---|
118 | =head1 SEE ALSO
|
---|
119 |
|
---|
120 | L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.
|
---|
121 |
|
---|
122 | =cut
|
---|