File Coverage

blib/lib/JSON/Relaxed.pm
Criterion Covered Total %
statement 19 28 67.8
branch n/a
condition 0 2 0.0
subroutine 7 9 77.7
pod 2 3 66.6
total 28 42 66.6


line stmt bran cond sub pod time code
1             #! perl
2              
3 10     10   1119530 use v5.26;
  10         38  
4 10     10   5401 use utf8;
  10         3273  
  10         136  
5              
6             package JSON::Relaxed;
7              
8 10     10   6353 use JSON::Relaxed::Parser; our $VERSION = $JSON::Relaxed::Parser::VERSION;
  10         47  
  10         2028  
9              
10             =encoding UTF-8
11              
12             =head1 NAME
13              
14             JSON::Relaxed -- An extension of JSON that allows for better human-readability
15              
16             =head1 Relaxed JSON?
17              
18             There's been increasing support for the idea of expanding JSON to improve
19             human-readability.
20             "Relaxed" JSON (RJSON) is a term that has been used to describe a
21             JSON-ish format that has some human-friendly features that JSON doesn't.
22             Most notably, RJSON allows the use of JavaScript-like comments and
23             eliminates the need to quote all keys and values.
24             An (official) specification can be found on
25             L.
26              
27             I
28             RJSON document.>
29              
30             =head1 SYNOPSIS
31              
32             use JSON::Relaxed;
33              
34             # Some raw RJSON data.
35             my $rjson = <<'RAW_DATA';
36             /* Javascript-like comments. */
37             {
38             // Keys do not require quotes.
39             // Single, double and backtick quotes.
40             a : 'Larry',
41             b : "Curly",
42             c : `Phoey`,
43             // Simple values do not require quotes.
44             d: unquoted
45              
46             // Nested structures.
47             e: [
48             { a:1, b:2 },
49             ],
50              
51             // Like Perl, trailing commas are allowed.
52             f: "more stuff",
53             }
54             RAW_DATA
55              
56             # Functional parsing.
57             my $hash = decode_rjson($rjson);
58              
59             # Object-oriented parsing.
60             my $parser = JSON::Relaxed->new();
61             $hash = $parser->decode($rjson);
62              
63             =head1 DESCRIPTION
64              
65             JSON::Relaxed is a lightweight parser and serializer for RJSON.
66             It is fully compliant to the
67             L specification.
68              
69             It does, however, have some additional extensions to make it really
70             relaxed.
71              
72             =head1 LEGACY MODE
73              
74             The old static method C has been renamed to C,
75             to conform to many other modules of this kind.
76             For compatibility with pre-0.060 versions
77             C is kept as a synonym for C.
78              
79             For the same reason, the old parser method C has been renamed
80             to C.
81             For compatibility C is kept as a synonym for C.
82              
83             When called by one of the old names, JSON::Relaxed will operate in
84             legacy mode. This changes the way errors are handled.
85              
86             =head1 REALLY RELAXED EXTENSIONS
87              
88             Extensions are disabled if option C is set.
89             Otherwise, most extensions are enabled by default.
90             Some extensions need an additional option setting.
91              
92             =head2 Leading commas in lists
93              
94             For example,
95              
96             [ , 1 ]
97              
98             Enabled by default, overruled by C.
99              
100             =head2 Hash keys without values
101              
102             JSON::Relaxed supports object keys without a specified value.
103             In that case the hash element is simply assigned the undefined value.
104              
105             In the following example, a is assigned 1, and b is assigned undef:
106              
107             { a:1, b }
108              
109             Enabled by default, overruled by C.
110              
111             =head2 String continuation
112              
113             Long strings can be aesthetically split over multiple lines by putting
114             a backslash at the end of the line:
115              
116             "this is a " \
117             "long string"
118              
119             Note that this is different from
120              
121             "this is a \
122             long string"
123              
124             which B the newline into the string, and requires continuation
125             lines to start at the beginning of the line to prevent unwanted spaces.
126              
127             Enabled by default, overruled by C.
128              
129             =head2 Extended Unicode escapes
130              
131             Unicode escapes in strings may contain an arbitrary number of hexadecimal
132             digits enclosed in braces:
133              
134             \u{1d10e}
135              
136             This eliminates the need to use
137             L
138             to obtain the same character:
139              
140             \uD834\uDD0E
141              
142             Enabled by default, overruled by C.
143              
144             =head2 Combined hash keys
145              
146             Hash keys that contain periods are considered subkeys, e.g.
147              
148             foo.bar: blech
149              
150             is equivalent to
151              
152             foo: {
153             bar: blech
154             }
155              
156             Requires C or C option. Overruled by C.
157              
158             =head2 Implied outer hash
159              
160             If the JSON looks like a hash, i.e. a string (key) followed by a
161             C<:>, the outer C<{> and C<}> are implied.
162              
163             For example:
164              
165             foo : bar
166              
167             is equivalent to:
168              
169             { foo : bar }
170              
171             Requires C or C option. Overruled by C.
172              
173             =head2 Garbage after JSON structure
174              
175             Requires C option. Overruled by C.
176              
177             Normally, parsing will fail unless the input contains exactly one
178             valid JSON structure, i.e. a string, a hash or an array.
179              
180             With C the first JSON structure is parsed and the
181             rest is ignored.
182              
183             =head2 PRP extensions
184              
185             Requires C option. Overruled by C.
186              
187             Enables some specific extensions:
188              
189             The equal sign C<=> can be used as an alternative to C<:> (colon).
190              
191             Colon (and equal sign) is optional between a key and its hash value.
192              
193             Single-line comments may start with C<#>.
194              
195             For example:
196              
197             # This is a sample PRP extended Really Relaxed JSON.
198             pdf.formats {
199             title.footer = [ "%{copyright}" "" "%{page}" ]
200             first.footer = [ "%{copyright}" "" "" ]
201             }
202              
203             This is equivalent to Really Relaxed JSON:
204              
205             // This is a sample Really Relaxed JSON.
206             pdf.formats: {
207             title.footer: [ "%{copyright}" "" "%{page}" ]
208             first.footer: [ "%{copyright}" "" "" ]
209             }
210              
211             And Relaxed JSON:
212              
213             // This is a sample Relaxed JSON.
214             {
215             pdf: {
216             formats: {
217             title: {
218             footer: [ "%{copyright}" "" "%{page}" ]
219             }
220             first: {
221             footer: [ "%{copyright}" "" "" ]
222             }
223             }
224             }
225             }
226              
227             And JSON:
228              
229             {
230             "pdf" : {
231             "formats" : {
232             "title" : {
233             "footer" : [ "%{copyright}", "", "%{page}" ]
234             }
235             },
236             "first" : {
237             "footer" : [ "%{copyright}", "", "" ]
238             }
239             }
240             }
241             }
242              
243             You decide what is easiest to write ☺.
244              
245             =head1 SUBROUTINES
246              
247             =head2 decode_rjson
248              
249             $structure = decode_rjson( $data, %options )
250              
251             C is the simple way to parse an RJSON string.
252             It is exported by default.
253             C takes a single parameter, the string to be parsed.
254              
255             Optionally an additional hash with options can be passed
256             to change the behaviour of the parser.
257             See L.
258              
259             $structure = decode_rjson( $rjson, %options );
260              
261             =cut
262              
263             our $err_id;
264             our $err_msg;
265              
266             sub decode_rjson {
267 0     0 1 0 my ( $raw, %options ) = @_;
268 10     10   80 use JSON::Relaxed::Parser;
  10         21  
  10         3437  
269 0         0 my $parser = JSON::Relaxed::Parser->new(%options);
270 0         0 my $res = $parser->decode($raw);
271             # Legacy.
272 0         0 $err_id = $parser->err_id;
273 0         0 $err_msg = $parser->err_msg;
274              
275 0         0 return $res;
276             }
277              
278             # Legacy.
279             sub from_rjson {
280 0     0 0 0 my ( $raw, %options ) = @_;
281 0   0     0 $options{croak_on_error} //= 0;
282 0         0 decode_rjson( $raw, %options );
283             }
284              
285             =head1 OBJECT-ORIENTED PARSING
286              
287              
288             =head2 new
289              
290             Create a C object, suitable for one or many operations.
291              
292             $parser = JSON::Relaxed->new( %options );
293              
294             Options:
295              
296             =over 4
297              
298             =item strict
299              
300             When set to a true value, enforces full compliance with the
301             L specification.
302              
303             Default value is false, enabling JSON::Relaxed extensions.
304              
305             =item croak_on_error
306              
307             Disabled by default in legacy mode, enabled otherwise.
308              
309             Causes parsing error to be signalled with an exception.
310              
311             See L.
312              
313             =item extra_tokens_ok
314              
315             =item combined_keys
316              
317             =item implied_outer_hash
318              
319             =item prp
320              
321             Enables/disables some of the extensions described
322             L.
323              
324             =item key_order
325              
326             Adds a key C<" key order "> to each hash, containing an array with the
327             hash keys in order of appearance. This is used for pretty printing.
328              
329             =back
330              
331             =head2 decode
332              
333             This method parses the JSON string, passed as argument.
334              
335             $structure = $parser->decode($rjson);
336              
337             =head2 parse
338              
339             This is the same as decode, but also enables legacy mode.
340              
341             =head2 err_id
342              
343             =head2 err_pos
344              
345             =head2 err_msg
346              
347             Fetches the error information for the last error, if any.
348              
349             Error ids are simple short strings, like C<"multiple-structures">.
350              
351             C fetches the text position in the JSON string where the
352             error occured. Returns -1 if this information is not available.
353              
354             C Fetches the text of the last error message.
355              
356             For a full list, see L.
357              
358             =head2 strict
359              
360             =head2 croak_on_error
361              
362             =head2 extra_tokens_ok
363              
364             =head2 combined_keys
365              
366             =head2 implied_outer_hash
367              
368             =head2 prp
369              
370             =head2 pretty (see "encode")
371              
372             =head2 key_order
373              
374             =head2 booleans (see L<"Boolean values">)
375              
376             Sets/resets options.
377              
378             Note that the value must be assigned to, e.g.
379              
380             $parser->strict = 1; # enable
381              
382             =head2 encode
383              
384             $string = $parser->encode( data => $data, %options )
385              
386             Produces a string with a really relaxed rendition of the data.
387             With option C, the rendition is pretty-printed.
388              
389             With option C the order of hash keys will be taken from a
390             pseudo-key C<" key order ">. This pseudo-key is added when option
391             C is passed to C.
392              
393             A Perl structure is passed as C option. This structure is encoded.
394             Note however that this structure may contain only strings, arrays and hashes.
395              
396             Option C can be used to provide schema data for structure to
397             be encoded. For each item to be encoded, the schema is consulted and
398             the following schema items are prepended as comments: C, </td> </tr> <tr> <td class="h" > <a name="399">399</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<description>, and C<infoText>. </td> </tr> <tr> <td class="h" > <a name="400">400</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="401">401</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="402">402</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="403">403</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub new { </td> </tr> <tr> <td class="h" > <a name="404">404</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-JSON-Relaxed-pm--subroutine.html#404-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-JSON-Relaxed-pm--subroutine.html#404-1"> 1 </a> </td> <td > 167376 </td> <td class="s"> my ($class, %opts) = @_; </td> </tr> <tr> <td class="h" > <a name="405">405</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 25 </td> <td class="s"> return JSON::Relaxed::Parser->new(%opts); </td> </tr> <tr> <td class="h" > <a name="406">406</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="407">407</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="408">408</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-JSON-Relaxed-pm--subroutine.html#408-1"> 10 </a> </td> <td >   </td> <td > 6273 </td> <td class="s"> use parent qw(Exporter); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4610 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 74 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="409">409</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> BEGIN { </td> </tr> <tr> <td class="h" > <a name="410">410</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-JSON-Relaxed-pm--subroutine.html#410-1"> 10 </a> </td> <td >   </td> <td > 1870 </td> <td class="s"> our @EXPORT = qw(decode_rjson); </td> </tr> <tr> <td class="h" > <a name="411">411</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 30 </td> <td class="s"> our @EXPORT_OK = ( @EXPORT, qw(from_rjson) ); </td> </tr> <tr> <td class="h" > <a name="412">412</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 700 </td> <td class="s"> our %EXPORT_TAGS = ( all => [ @EXPORT_OK ] ); </td> </tr> <tr> <td class="h" > <a name="413">413</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="414">414</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="415">415</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 MAPPING </td> </tr> <tr> <td class="h" > <a name="416">416</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="417">417</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 RRJSON to Perl </td> </tr> <tr> <td class="h" > <a name="418">418</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="419">419</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="420">420</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="421">421</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="422">422</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="423">423</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Numbers are unquoted strings. They will be mapped to numbers if the </td> </tr> <tr> <td class="h" > <a name="424">424</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> repesentation is identical to the source. </td> </tr> <tr> <td class="h" > <a name="425">425</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> For example, the unquoted string C<1> and the quoted string C<"1"> </td> </tr> <tr> <td class="h" > <a name="426">426</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> will both yield the number C<1> </td> </tr> <tr> <td class="h" > <a name="427">427</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The unquoted string C<1.0> will also yield the number C<1>, </td> </tr> <tr> <td class="h" > <a name="428">428</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> but C<"1.0"> will yield the string C<"1.0">. </td> </tr> <tr> <td class="h" > <a name="429">429</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="430">430</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="431">431</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="432">432</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Unquoted C<null> will become C<undef>. </td> </tr> <tr> <td class="h" > <a name="433">433</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="434">434</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="435">435</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="436">436</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Unquoted C<true> and C<false> will yield JSON::Boolean objects that </td> </tr> <tr> <td class="h" > <a name="437">437</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> test as boolean (true resp. false) and stringify as C<"true"> resp. </td> </tr> <tr> <td class="h" > <a name="438">438</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<"false">. See L</"Boolean values"> how to change this behaviour. </td> </tr> <tr> <td class="h" > <a name="439">439</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="440">440</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Likewise unquoted C<on> and C<off> when option C<prp> is specified. </td> </tr> <tr> <td class="h" > <a name="441">441</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="442">442</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="443">443</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="444">444</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Other unquoted strings will be treated as quoted strings. </td> </tr> <tr> <td class="h" > <a name="445">445</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="446">446</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="447">447</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="448">448</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Perl to RRJSON </td> </tr> <tr> <td class="h" > <a name="449">449</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="450">450</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 4 </td> </tr> <tr> <td class="h" > <a name="451">451</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="452">452</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="453">453</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="454">454</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Numbers will be output as numbers. </td> </tr> <tr> <td class="h" > <a name="455">455</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="456">456</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="457">457</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="458">458</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Strings will be output as unquoted strings if possible, quoted strings </td> </tr> <tr> <td class="h" > <a name="459">459</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> otherwise. Non-latin characters will be output as C<\u> escapes. </td> </tr> <tr> <td class="h" > <a name="460">460</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> When some of the quotes C<" ' `> are embedded the others will be tried </td> </tr> <tr> <td class="h" > <a name="461">461</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> for the string, e.g. C<"a\"b"> will yield C<'a"b'>. </td> </tr> <tr> <td class="h" > <a name="462">462</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="463">463</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> All quotes are equal, there is no difference in interpretation. </td> </tr> <tr> <td class="h" > <a name="464">464</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="465">465</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="466">466</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="467">467</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Boolean objects will be output as unquoted C<true> and C<false>. </td> </tr> <tr> <td class="h" > <a name="468">468</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="469">469</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item * </td> </tr> <tr> <td class="h" > <a name="470">470</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="471">471</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Undefined values will be output as C<null>. </td> </tr> <tr> <td class="h" > <a name="472">472</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="473">473</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="474">474</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="475">475</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Boolean values </td> </tr> <tr> <td class="h" > <a name="476">476</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="477">477</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> By default JSON::Boolean objects will be used for unquoted C<true> and </td> </tr> <tr> <td class="h" > <a name="478">478</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<false>. The C<booleans> method can be used to change this. </td> </tr> <tr> <td class="h" > <a name="479">479</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="480">480</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $parser->booleans = [ false-value, true-value ] </td> </tr> <tr> <td class="h" > <a name="481">481</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="482">482</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This sets the values to be used for C<true> and C<false>. </td> </tr> <tr> <td class="h" > <a name="483">483</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Default is </td> </tr> <tr> <td class="h" > <a name="484">484</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="485">485</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $parser->booleans = [ $JSON::Boolean::false, $JSON::Boolean::true ] </td> </tr> <tr> <td class="h" > <a name="486">486</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="487">487</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> A non-array true value establishes the default. </td> </tr> <tr> <td class="h" > <a name="488">488</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="489">489</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Setting to a false value is the same as </td> </tr> <tr> <td class="h" > <a name="490">490</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="491">491</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $parser->booleans = [ 0, 1 ] </td> </tr> <tr> <td class="h" > <a name="492">492</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="493">493</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> With option C<prp>, unquoted C<on> is the same as C<true>, and C<off> </td> </tr> <tr> <td class="h" > <a name="494">494</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> is the same as C<false>. </td> </tr> <tr> <td class="h" > <a name="495">495</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="496">496</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 ERROR HANDLING </td> </tr> <tr> <td class="h" > <a name="497">497</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="498">498</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If the document cannot be parsed, JSON::Relaxed will throw an </td> </tr> <tr> <td class="h" > <a name="499">499</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> exception. </td> </tr> <tr> <td class="h" > <a name="500">500</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="501">501</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> In legacy mode, JSON::Relaxed returns an undefined </td> </tr> <tr> <td class="h" > <a name="502">502</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> value and sets error indicators in $JSON::Relaxed::err_id and </td> </tr> <tr> <td class="h" > <a name="503">503</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $JSON::Relaxed::err_msg. </td> </tr> <tr> <td class="h" > <a name="504">504</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="505">505</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If parser property C<croak_on_error> is set to a false </td> </tr> <tr> <td class="h" > <a name="506">506</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> value, it will behave as if in legacy mode. </td> </tr> <tr> <td class="h" > <a name="507">507</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="508">508</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> For a full list of error codes, see L<JSON::Relaxed::ErrorCodes>. </td> </tr> <tr> <td class="h" > <a name="509">509</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="510">510</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 AUTHOR </td> </tr> <tr> <td class="h" > <a name="511">511</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="512">512</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Johan Vromans F<jv@cpan.org> </td> </tr> <tr> <td class="h" > <a name="513">513</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="514">514</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Based on original code from Miko O'Sullivan F<miko@idocs.com>. </td> </tr> <tr> <td class="h" > <a name="515">515</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="516">516</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 SUPPORT </td> </tr> <tr> <td class="h" > <a name="517">517</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="518">518</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Development of this module takes place on GitHub: </td> </tr> <tr> <td class="h" > <a name="519">519</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<https://github.com/sciurius/perl-JSON-Relaxed>. </td> </tr> <tr> <td class="h" > <a name="520">520</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="521">521</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> You can find documentation for this module with the perldoc command. </td> </tr> <tr> <td class="h" > <a name="522">522</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="523">523</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> perldoc JSON::Relaxed </td> </tr> <tr> <td class="h" > <a name="524">524</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="525">525</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Please report any bugs or feature requests using the issue tracker on </td> </tr> <tr> <td class="h" > <a name="526">526</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> GitHub. </td> </tr> <tr> <td class="h" > <a name="527">527</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="528">528</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 LICENSE </td> </tr> <tr> <td class="h" > <a name="529">529</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="530">530</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Copyright (c) 2024 by Johan Vromans. All rights reserved. This </td> </tr> <tr> <td class="h" > <a name="531">531</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> program is free software; you can redistribute it and/or modify it </td> </tr> <tr> <td class="h" > <a name="532">532</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> under the same terms as Perl itself. This software comes with B<NO </td> </tr> <tr> <td class="h" > <a name="533">533</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> WARRANTY> of any kind. </td> </tr> <tr> <td class="h" > <a name="534">534</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="535">535</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="536">536</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="537">537</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1; </td> </tr> </table> </body> </html>