From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
sub TIEHASH {
my ($cls,$o) = @_;
my $self = bless { pjsn => $o }, $cls;
return $self;
}
sub STORE {
my $self = $_[0];
$self->{pjsn}->_escape_table_chr(ord($_[1]), $_[2]);
}
sub FETCH {
my $self = $_[0];
my $c = $_[1];
# always unescape RFC 4627-mandated escaped characters
$self->{pjsn}->_escape_table_chr(ord($_[1]));
}
sub EXISTS {
goto &FETCH;
}
sub DELETE {
$_[2] = 0;
goto &STORE;
}
sub FIRSTKEY {
my $self = $_[0];
$self->{idx} = -1;
$self->NEXTKEY;
}
sub NEXTKEY {
my $self = $_[0];
return if ++$self->{idx} > 0x7f;
chr($self->{idx});
}
sub SCALAR {
'127/127';
}
sub CLEAR {
my $self = $_[0];
$self->{pjsn}->_escape_table_chr($_, 0) foreach (0..0x7f);
}
1;
__END__
=head3 unescape_settings()
=head3 unescape_settings($character)
=head3 unescape_settings($character, $boolean)
Inspects and modifies the preferences for unescaping JSON strings. JSON allows
several forms of escape sequences, either via the C<\uXXXX> form, or via a two-
character 'common' form for specific characters.
=head4 DEFAULT UNESCAPING BEHAVIOR
For C<\uXXXX> escapes, the single or multi-byte representation of the encoded
character is placed into the resultant string, thus:
\u0041 becomes A
For JSON structural tokens, the backslash is swallowed and the character following
it is left as-is. JSON I<requires> that these characters be escaped.
\" becomes "
\\ becomes \
Additionally, JSON allows the C</> character to be escaped (though it is not
a JSON structural token, and does not require escaping).
\/ becomes /
For certain allowable control and whitespace characters, the escape is translated
into its corresponding ASCII value, thus:
\n becomes chr(0x0A) <LF>
\r becomes chr(0x0D) <CR>
\t becomes chr(0x09) <TAB>
\b becomes chr(0x08) <Backspace>
\f becomes chr(0x0C) <Form Feed>
Any other two-character escape sequence is not allowed, and JSON::SL will croak
upon encountering it.
By default, all that is allowed to be escaped is also automatically unescaped,
but this behavior is configurable via the C<unescape_settings>
Called without any arguments, C<unescape_settings> returns a reference to a hash.
Its keys are valid ASCII characters and its values are booleans
indicating whether C<JSON::SL> should treat them specially if they follow a C<\>.
Thus, to disable special handling for newlines and tabs:
delete @{$json->unescape_settings}{"\t","\n","\r"};
If C<unescape_settings> is called with one or two arguments, the first argument
is taken as the character, and the second argument (if present) is taken as a
boolean value which the character should be set to:
Check if forward-slashes are unescaped:
my $fwslash_is_unescaped = $json->unescape_settings("/");
Disable handling for C<\uXXXX> sequences:
$json->unescape_settings("u", 0);