Blame lib/JSON.pm

Packit Service 639957
package JSON;
Packit Service 639957
Packit Service 639957
Packit Service 639957
use strict;
Packit Service 639957
use Carp ();
Packit Service 639957
use Exporter;
Packit Service 639957
BEGIN { @JSON::ISA = 'Exporter' }
Packit Service 639957
Packit Service 639957
@JSON::EXPORT = qw(from_json to_json jsonToObj objToJson encode_json decode_json);
Packit Service 639957
Packit Service 639957
BEGIN {
Packit Service 639957
    $JSON::VERSION = '2.97001';
Packit Service 639957
    $JSON::DEBUG   = 0 unless (defined $JSON::DEBUG);
Packit Service 639957
    $JSON::DEBUG   = $ENV{ PERL_JSON_DEBUG } if exists $ENV{ PERL_JSON_DEBUG };
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
my %RequiredVersion = (
Packit Service 639957
    'JSON::PP' => '2.27203',
Packit Service 639957
    'JSON::XS' => '2.34',
Packit Service 639957
);
Packit Service 639957
Packit Service 639957
# XS and PP common methods
Packit Service 639957
Packit Service 639957
my @PublicMethods = qw/
Packit Service 639957
    ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref 
Packit Service 639957
    allow_blessed convert_blessed filter_json_object filter_json_single_key_object 
Packit Service 639957
    shrink max_depth max_size encode decode decode_prefix allow_unknown
Packit Service 639957
/;
Packit Service 639957
Packit Service 639957
my @Properties = qw/
Packit Service 639957
    ascii latin1 utf8 indent space_before space_after relaxed canonical allow_nonref
Packit Service 639957
    allow_blessed convert_blessed shrink max_depth max_size allow_unknown
Packit Service 639957
/;
Packit Service 639957
Packit Service 639957
my @XSOnlyMethods = qw/allow_tags/; # Currently nothing
Packit Service 639957
Packit Service 639957
my @PPOnlyMethods = qw/
Packit Service 639957
    indent_length sort_by
Packit Service 639957
    allow_singlequote allow_bignum loose allow_barekey escape_slash as_nonblessed
Packit Service 639957
/; # JSON::PP specific
Packit Service 639957
Packit Service 639957
Packit Service 639957
# used in _load_xs and _load_pp ($INSTALL_ONLY is not used currently)
Packit Service 639957
my $_INSTALL_DONT_DIE  = 1; # When _load_xs fails to load XS, don't die.
Packit Service 639957
my $_ALLOW_UNSUPPORTED = 0;
Packit Service 639957
my $_UNIV_CONV_BLESSED = 0;
Packit Service 639957
Packit Service 639957
Packit Service 639957
# Check the environment variable to decide worker module. 
Packit Service 639957
Packit Service 639957
unless ($JSON::Backend) {
Packit Service 639957
    $JSON::DEBUG and  Carp::carp("Check used worker module...");
Packit Service 639957
Packit Service 639957
    my $backend = exists $ENV{PERL_JSON_BACKEND} ? $ENV{PERL_JSON_BACKEND} : 1;
Packit Service 639957
Packit Service 639957
    if ($backend eq '1') {
Packit Service 639957
        $backend = 'JSON::XS,JSON::PP';
Packit Service 639957
    }
Packit Service 639957
    elsif ($backend eq '0') {
Packit Service 639957
        $backend = 'JSON::PP';
Packit Service 639957
    }
Packit Service 639957
    elsif ($backend eq '2') {
Packit Service 639957
        $backend = 'JSON::XS';
Packit Service 639957
    }
Packit Service 639957
    $backend =~ s/\s+//g;
Packit Service 639957
Packit Service 639957
    my @backend_modules = split /,/, $backend;
Packit Service 639957
    while(my $module = shift @backend_modules) {
Packit Service 639957
        if ($module =~ /JSON::XS/) {
Packit Service 639957
            _load_xs($module, @backend_modules ? $_INSTALL_DONT_DIE : 0);
Packit Service 639957
        }
Packit Service 639957
        elsif ($module =~ /JSON::PP/) {
Packit Service 639957
            _load_pp($module);
Packit Service 639957
        }
Packit Service 639957
        elsif ($module =~ /JSON::backportPP/) {
Packit Service 639957
            _load_pp($module);
Packit Service 639957
        }
Packit Service 639957
        else {
Packit Service 639957
            Carp::croak "The value of environmental variable 'PERL_JSON_BACKEND' is invalid.";
Packit Service 639957
        }
Packit Service 639957
        last if $JSON::Backend;
Packit Service 639957
    }
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub import {
Packit Service 639957
    my $pkg = shift;
Packit Service 639957
    my @what_to_export;
Packit Service 639957
    my $no_export;
Packit Service 639957
Packit Service 639957
    for my $tag (@_) {
Packit Service 639957
        if ($tag eq '-support_by_pp') {
Packit Service 639957
            if (!$_ALLOW_UNSUPPORTED++) {
Packit Service 639957
                JSON::Backend::XS
Packit Service 639957
                    ->support_by_pp(@PPOnlyMethods) if ($JSON::Backend->is_xs);
Packit Service 639957
            }
Packit Service 639957
            next;
Packit Service 639957
        }
Packit Service 639957
        elsif ($tag eq '-no_export') {
Packit Service 639957
            $no_export++, next;
Packit Service 639957
        }
Packit Service 639957
        elsif ( $tag eq '-convert_blessed_universally' ) {
Packit Service 639957
            my $org_encode = $JSON::Backend->can('encode');
Packit Service 639957
            eval q|
Packit Service 639957
                require B;
Packit Service 639957
                local $^W;
Packit Service 639957
                no strict 'refs';
Packit Service 639957
                *{"${JSON::Backend}\::encode"} = sub {
Packit Service 639957
                    # only works with Perl 5.18+
Packit Service 639957
                    local *UNIVERSAL::TO_JSON = sub {
Packit Service 639957
                        my $b_obj = B::svref_2object( $_[0] );
Packit Service 639957
                        return    $b_obj->isa('B::HV') ? { %{ $_[0] } }
Packit Service 639957
                                : $b_obj->isa('B::AV') ? [ @{ $_[0] } ]
Packit Service 639957
                                : undef
Packit Service 639957
                                ;
Packit Service 639957
                    };
Packit Service 639957
                    $org_encode->(@_);
Packit Service 639957
                };
Packit Service 639957
            | if ( !$_UNIV_CONV_BLESSED++ );
Packit Service 639957
            next;
Packit Service 639957
        }
Packit Service 639957
        push @what_to_export, $tag;
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
    return if ($no_export);
Packit Service 639957
Packit Service 639957
    __PACKAGE__->export_to_level(1, $pkg, @what_to_export);
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
Packit Service 639957
# OBSOLETED
Packit Service 639957
Packit Service 639957
sub jsonToObj {
Packit Service 639957
    my $alternative = 'from_json';
Packit Service 639957
    if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
Packit Service 639957
        shift @_; $alternative = 'decode';
Packit Service 639957
    }
Packit Service 639957
    Carp::carp "'jsonToObj' will be obsoleted. Please use '$alternative' instead.";
Packit Service 639957
    return JSON::from_json(@_);
Packit Service 639957
};
Packit Service 639957
Packit Service 639957
sub objToJson {
Packit Service 639957
    my $alternative = 'to_json';
Packit Service 639957
    if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
Packit Service 639957
        shift @_; $alternative = 'encode';
Packit Service 639957
    }
Packit Service 639957
    Carp::carp "'objToJson' will be obsoleted. Please use '$alternative' instead.";
Packit Service 639957
    JSON::to_json(@_);
Packit Service 639957
};
Packit Service 639957
Packit Service 639957
Packit Service 639957
# INTERFACES
Packit Service 639957
Packit Service 639957
sub to_json ($@) {
Packit Service 639957
    if (
Packit Service 639957
        ref($_[0]) eq 'JSON'
Packit Service 639957
        or (@_ > 2 and $_[0] eq 'JSON')
Packit Service 639957
    ) {
Packit Service 639957
        Carp::croak "to_json should not be called as a method.";
Packit Service 639957
    }
Packit Service 639957
    my $json = JSON->new;
Packit Service 639957
Packit Service 639957
    if (@_ == 2 and ref $_[1] eq 'HASH') {
Packit Service 639957
        my $opt  = $_[1];
Packit Service 639957
        for my $method (keys %$opt) {
Packit Service 639957
            $json->$method( $opt->{$method} );
Packit Service 639957
        }
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
    $json->encode($_[0]);
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub from_json ($@) {
Packit Service 639957
    if ( ref($_[0]) eq 'JSON' or $_[0] eq 'JSON' ) {
Packit Service 639957
        Carp::croak "from_json should not be called as a method.";
Packit Service 639957
    }
Packit Service 639957
    my $json = JSON->new;
Packit Service 639957
Packit Service 639957
    if (@_ == 2 and ref $_[1] eq 'HASH') {
Packit Service 639957
        my $opt  = $_[1];
Packit Service 639957
        for my $method (keys %$opt) {
Packit Service 639957
            $json->$method( $opt->{$method} );
Packit Service 639957
        }
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
    return $json->decode( $_[0] );
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub true  { $JSON::true  }
Packit Service 639957
Packit Service 639957
sub false { $JSON::false }
Packit Service 639957
Packit Service 639957
sub null  { undef; }
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub require_xs_version { $RequiredVersion{'JSON::XS'}; }
Packit Service 639957
Packit Service 639957
sub backend {
Packit Service 639957
    my $proto = shift;
Packit Service 639957
    $JSON::Backend;
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
#*module = *backend;
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub is_xs {
Packit Service 639957
    return $_[0]->backend->is_xs;
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub is_pp {
Packit Service 639957
    return $_[0]->backend->is_pp;
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub pureperl_only_methods { @PPOnlyMethods; }
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub property {
Packit Service 639957
    my ($self, $name, $value) = @_;
Packit Service 639957
Packit Service 639957
    if (@_ == 1) {
Packit Service 639957
        my %props;
Packit Service 639957
        for $name (@Properties) {
Packit Service 639957
            my $method = 'get_' . $name;
Packit Service 639957
            if ($name eq 'max_size') {
Packit Service 639957
                my $value = $self->$method();
Packit Service 639957
                $props{$name} = $value == 1 ? 0 : $value;
Packit Service 639957
                next;
Packit Service 639957
            }
Packit Service 639957
            $props{$name} = $self->$method();
Packit Service 639957
        }
Packit Service 639957
        return \%props;
Packit Service 639957
    }
Packit Service 639957
    elsif (@_ > 3) {
Packit Service 639957
        Carp::croak('property() can take only the option within 2 arguments.');
Packit Service 639957
    }
Packit Service 639957
    elsif (@_ == 2) {
Packit Service 639957
        if ( my $method = $self->can('get_' . $name) ) {
Packit Service 639957
            if ($name eq 'max_size') {
Packit Service 639957
                my $value = $self->$method();
Packit Service 639957
                return $value == 1 ? 0 : $value;
Packit Service 639957
            }
Packit Service 639957
            $self->$method();
Packit Service 639957
        }
Packit Service 639957
    }
Packit Service 639957
    else {
Packit Service 639957
        $self->$name($value);
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
Packit Service 639957
Packit Service 639957
# INTERNAL
Packit Service 639957
Packit Service 639957
sub __load_xs {
Packit Service 639957
    my ($module, $opt) = @_;
Packit Service 639957
Packit Service 639957
    $JSON::DEBUG and Carp::carp "Load $module.";
Packit Service 639957
    my $required_version = $RequiredVersion{$module} || '';
Packit Service 639957
Packit Service 639957
    eval qq|
Packit Service 639957
        use $module $required_version ();
Packit Service 639957
    |;
Packit Service 639957
Packit Service 639957
    if ($@) {
Packit Service 639957
        if (defined $opt and $opt & $_INSTALL_DONT_DIE) {
Packit Service 639957
            $JSON::DEBUG and Carp::carp "Can't load $module...($@)";
Packit Service 639957
            return 0;
Packit Service 639957
        }
Packit Service 639957
        Carp::croak $@;
Packit Service 639957
    }
Packit Service 639957
    $JSON::BackendModuleXS = $module;
Packit Service 639957
    return 1;
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
sub _load_xs {
Packit Service 639957
    my ($module, $opt) = @_;
Packit Service 639957
    __load_xs($module, $opt) or return;
Packit Service 639957
Packit Service 639957
    my $data = join("", <DATA>); # this code is from Jcode 2.xx.
Packit Service 639957
    close(DATA);
Packit Service 639957
    eval $data;
Packit Service 639957
    JSON::Backend::XS->init($module);
Packit Service 639957
Packit Service 639957
    return 1;
Packit Service 639957
};
Packit Service 639957
Packit Service 639957
Packit Service 639957
sub __load_pp {
Packit Service 639957
    my ($module, $opt) = @_;
Packit Service 639957
Packit Service 639957
    $JSON::DEBUG and Carp::carp "Load $module.";
Packit Service 639957
    my $required_version = $RequiredVersion{$module} || '';
Packit Service 639957
Packit Service 639957
    eval qq| use $module $required_version () |;
Packit Service 639957
Packit Service 639957
    if ($@) {
Packit Service 639957
        if ( $module eq 'JSON::PP' ) {
Packit Service 639957
            $JSON::DEBUG and Carp::carp "Can't load $module ($@), so try to load JSON::backportPP";
Packit Service 639957
            $module = 'JSON::backportPP';
Packit Service 639957
            local $^W; # if PP installed but invalid version, backportPP redefines methods.
Packit Service 639957
            eval qq| require $module |;
Packit Service 639957
        }
Packit Service 639957
        Carp::croak $@ if $@;
Packit Service 639957
    }
Packit Service 639957
    $JSON::BackendModulePP = $module;
Packit Service 639957
    return 1;
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
sub _load_pp {
Packit Service 639957
    my ($module, $opt) = @_;
Packit Service 639957
    __load_pp($module, $opt);
Packit Service 639957
Packit Service 639957
    JSON::Backend::PP->init($module);
Packit Service 639957
};
Packit Service 639957
Packit Service 639957
#
Packit Service 639957
# Helper classes for Backend Module (PP)
Packit Service 639957
#
Packit Service 639957
Packit Service 639957
package JSON::Backend::PP;
Packit Service 639957
Packit Service 639957
sub init {
Packit Service 639957
    my ($class, $module) = @_;
Packit Service 639957
Packit Service 639957
    # name may vary, but the module should (always) be a JSON::PP
Packit Service 639957
Packit Service 639957
    local $^W;
Packit Service 639957
    no strict qw(refs); # this routine may be called after JSON::Backend::XS init was called.
Packit Service 639957
    *{"JSON::decode_json"} = \&{"JSON::PP::decode_json"};
Packit Service 639957
    *{"JSON::encode_json"} = \&{"JSON::PP::encode_json"};
Packit Service 639957
    *{"JSON::is_bool"} = \&{"JSON::PP::is_bool"};
Packit Service 639957
Packit Service 639957
    $JSON::true  = ${"JSON::PP::true"};
Packit Service 639957
    $JSON::false = ${"JSON::PP::false"};
Packit Service 639957
Packit Service 639957
    push @JSON::Backend::PP::ISA, 'JSON::PP';
Packit Service 639957
    push @JSON::ISA, $class;
Packit Service 639957
    $JSON::Backend = $class;
Packit Service 639957
    $JSON::BackendModule = $module;
Packit Service 639957
    ${"$class\::VERSION"} = $module->VERSION;
Packit Service 639957
Packit Service 639957
    for my $method (@XSOnlyMethods) {
Packit Service 639957
        *{"JSON::$method"} = sub {
Packit Service 639957
            Carp::carp("$method is not supported in $module.");
Packit Service 639957
            $_[0];
Packit Service 639957
        };
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
    return 1;
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
sub is_xs { 0 };
Packit Service 639957
sub is_pp { 1 };
Packit Service 639957
Packit Service 639957
#
Packit Service 639957
# To save memory, the below lines are read only when XS backend is used.
Packit Service 639957
#
Packit Service 639957
Packit Service 639957
package JSON;
Packit Service 639957
Packit Service 639957
1;
Packit Service 639957
__DATA__
Packit Service 639957
Packit Service 639957
Packit Service 639957
#
Packit Service 639957
# Helper classes for Backend Module (XS)
Packit Service 639957
#
Packit Service 639957
Packit Service 639957
package JSON::Backend::XS;
Packit Service 639957
Packit Service 639957
sub init {
Packit Service 639957
    my ($class, $module) = @_;
Packit Service 639957
Packit Service 639957
    local $^W;
Packit Service 639957
    no strict qw(refs);
Packit Service 639957
    *{"JSON::decode_json"} = \&{"$module\::decode_json"};
Packit Service 639957
    *{"JSON::encode_json"} = \&{"$module\::encode_json"};
Packit Service 639957
    *{"JSON::is_bool"} = \&{"$module\::is_bool"};
Packit Service 639957
Packit Service 639957
    $JSON::true  = ${"$module\::true"};
Packit Service 639957
    $JSON::false = ${"$module\::false"};
Packit Service 639957
Packit Service 639957
    push @JSON::Backend::XS::ISA, $module;
Packit Service 639957
    push @JSON::ISA, $class;
Packit Service 639957
    $JSON::Backend = $class;
Packit Service 639957
    $JSON::BackendModule = $module;
Packit Service 639957
    ${"$class\::VERSION"} = $module->VERSION;
Packit Service 639957
Packit Service 639957
    if ( $module->VERSION < 3 ) {
Packit Service 639957
        eval 'package JSON::PP::Boolean';
Packit Service 639957
        push @{"$module\::Boolean::ISA"}, qw(JSON::PP::Boolean);
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
    for my $method (@PPOnlyMethods) {
Packit Service 639957
        *{"JSON::$method"} = sub {
Packit Service 639957
            Carp::carp("$method is not supported in $module.");
Packit Service 639957
            $_[0];
Packit Service 639957
        };
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
    return 1;
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
sub is_xs { 1 };
Packit Service 639957
sub is_pp { 0 };
Packit Service 639957
Packit Service 639957
sub support_by_pp {
Packit Service 639957
    my ($class, @methods) = @_;
Packit Service 639957
Packit Service 639957
    JSON::__load_pp('JSON::PP');
Packit Service 639957
Packit Service 639957
    local $^W;
Packit Service 639957
    no strict qw(refs);
Packit Service 639957
Packit Service 639957
    for my $method (@methods) {
Packit Service 639957
        my $pp_method = JSON::PP->can($method) or next;
Packit Service 639957
        *{"JSON::$method"} = sub {
Packit Service 639957
            if (!$_[0]->isa('JSON::PP')) {
Packit Service 639957
                my $xs_self = $_[0];
Packit Service 639957
                my $pp_self = JSON::PP->new;
Packit Service 639957
                for (@Properties) {
Packit Service 639957
                     my $getter = "get_$_";
Packit Service 639957
                    $pp_self->$_($xs_self->$getter);
Packit Service 639957
                }
Packit Service 639957
                $_[0] = $pp_self;
Packit Service 639957
            }
Packit Service 639957
            $pp_method->(@_);
Packit Service 639957
        };
Packit Service 639957
    }
Packit Service 639957
Packit Service 639957
    $JSON::DEBUG and Carp::carp("set -support_by_pp mode.");
Packit Service 639957
}
Packit Service 639957
Packit Service 639957
1;
Packit Service 639957
__END__
Packit Service 639957
Packit Service 639957
=head1 NAME
Packit Service 639957
Packit Service 639957
JSON - JSON (JavaScript Object Notation) encoder/decoder
Packit Service 639957
Packit Service 639957
=head1 SYNOPSIS
Packit Service 639957
Packit Service 639957
 use JSON; # imports encode_json, decode_json, to_json and from_json.
Packit Service 639957
 
Packit Service 639957
 # simple and fast interfaces (expect/generate UTF-8)
Packit Service 639957
 
Packit Service 639957
 $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
Packit Service 639957
 $perl_hash_or_arrayref  = decode_json $utf8_encoded_json_text;
Packit Service 639957
 
Packit Service 639957
 # OO-interface
Packit Service 639957
 
Packit Service 639957
 $json = JSON->new->allow_nonref;
Packit Service 639957
 
Packit Service 639957
 $json_text   = $json->encode( $perl_scalar );
Packit Service 639957
 $perl_scalar = $json->decode( $json_text );
Packit Service 639957
 
Packit Service 639957
 $pretty_printed = $json->pretty->encode( $perl_scalar ); # pretty-printing
Packit Service 639957
Packit Service 639957
=head1 VERSION
Packit Service 639957
Packit Service 639957
    2.97001
Packit Service 639957
Packit Service 639957
=head1 DESCRIPTION
Packit Service 639957
Packit Service 639957
This module is a thin wrapper for L<JSON::XS>-compatible modules with a few
Packit Service 639957
additional features. All the backend modules convert a Perl data structure
Packit Service 639957
to a JSON text as of RFC4627 (which we know is obsolete but we still stick
Packit Service 639957
to; see below for an option to support part of RFC7159) and vice versa.
Packit Service 639957
This module uses L<JSON::XS> by default, and when JSON::XS is not available,
Packit Service 639957
this module falls back on L<JSON::PP>, which is in the Perl core since 5.14.
Packit Service 639957
If JSON::PP is not available either, this module then falls back on
Packit Service 639957
JSON::backportPP (which is actually JSON::PP in a different .pm file)
Packit Service 639957
bundled in the same distribution as this module. You can also explicitly
Packit Service 639957
specify to use L<Cpanel::JSON::XS>, a fork of JSON::XS by Reini Urban.
Packit Service 639957
Packit Service 639957
All these backend modules have slight incompatibilities between them,
Packit Service 639957
including extra features that other modules don't support, but as long as you
Packit Service 639957
use only common features (most important ones are described below), migration
Packit Service 639957
from backend to backend should be reasonably easy. For details, see each
Packit Service 639957
backend module you use.
Packit Service 639957
Packit Service 639957
=head1 CHOOSING BACKEND
Packit Service 639957
Packit Service 639957
This module respects an environmental variable called C<PERL_JSON_BACKEND>
Packit Service 639957
when it decides a backend module to use. If this environmental variable is
Packit Service 639957
not set, it tries to load JSON::XS, and if JSON::XS is not available, it
Packit Service 639957
falls back on JSON::PP, and then JSON::backportPP if JSON::PP is not available
Packit Service 639957
either.
Packit Service 639957
Packit Service 639957
If you always don't want it to fall back on pure perl modules, set the
Packit Service 639957
variable like this (C<export> may be C<setenv>, C<set> and the likes,
Packit Service 639957
depending on your environment):
Packit Service 639957
Packit Service 639957
  > export PERL_JSON_BACKEND=JSON::XS
Packit Service 639957
Packit Service 639957
If you prefer Cpanel::JSON::XS to JSON::XS, then:
Packit Service 639957
Packit Service 639957
  > export PERL_JSON_BACKEND=Cpanel::JSON::XS,JSON::XS,JSON::PP
Packit Service 639957
Packit Service 639957
You may also want to set this variable at the top of your test files, in order
Packit Service 639957
not to be bothered with incompatibilities between backends (you need to wrap
Packit Service 639957
this in C<BEGIN>, and set before actually C<use>-ing JSON module, as it decides
Packit Service 639957
its backend as soon as it's loaded):
Packit Service 639957
Packit Service 639957
  BEGIN { $ENV{PERL_JSON_BACKEND}='JSON::backportPP'; }
Packit Service 639957
  use JSON;
Packit Service 639957
Packit Service 639957
=head1 USING OPTIONAL FEATURES
Packit Service 639957
Packit Service 639957
There are a few options you can set when you C<use> this module:
Packit Service 639957
Packit Service 639957
=over
Packit Service 639957
Packit Service 639957
=item -support_by_pp
Packit Service 639957
Packit Service 639957
   BEGIN { $ENV{PERL_JSON_BACKEND} = 'JSON::XS' }
Packit Service 639957
   
Packit Service 639957
   use JSON -support_by_pp;
Packit Service 639957
   
Packit Service 639957
   my $json = JSON->new;
Packit Service 639957
   # escape_slash is for JSON::PP only.
Packit Service 639957
   $json->allow_nonref->escape_slash->encode("/");
Packit Service 639957
Packit Service 639957
With this option, this module loads its pure perl backend along with
Packit Service 639957
its XS backend (if available), and lets the XS backend to watch if you set
Packit Service 639957
a flag only JSON::PP supports. When you do, the internal JSON::XS object
Packit Service 639957
is replaced with a newly created JSON::PP object with the setting copied
Packit Service 639957
from the XS object, so that you can use JSON::PP flags (and its slower
Packit Service 639957
C<decode>/C<encode> methods) from then on. In other words, this is not
Packit Service 639957
something that allows you to hook JSON::XS to change its behavior while
Packit Service 639957
keeping its speed. JSON::XS and JSON::PP objects are quite different
Packit Service 639957
(JSON::XS object is a blessed scalar reference, while JSON::PP object is
Packit Service 639957
a blessed hash reference), and can't share their internals.
Packit Service 639957
Packit Service 639957
To avoid needless overhead (by copying settings), you are advised not
Packit Service 639957
to use this option and just to use JSON::PP explicitly when you need
Packit Service 639957
JSON::PP features.
Packit Service 639957
Packit Service 639957
=item -convert_blessed_universally
Packit Service 639957
Packit Service 639957
   use JSON -convert_blessed_universally;
Packit Service 639957
Packit Service 639957
   my $json = JSON->new->allow_nonref->convert_blessed;
Packit Service 639957
   my $object = bless {foo => 'bar'}, 'Foo';
Packit Service 639957
   $json->encode($object); # => {"foo":"bar"}
Packit Service 639957
Packit Service 639957
JSON::XS-compatible backend modules don't encode blessed objects by
Packit Service 639957
default (except for their boolean values, which are typically blessed
Packit Service 639957
JSON::PP::Boolean objects). If you need to encode a data structure
Packit Service 639957
that may contain objects, you usually need to look into the structure
Packit Service 639957
and replace objects with alternative non-blessed values, or enable
Packit Service 639957
C<convert_blessed> and provide a C<TO_JSON> method for each object's
Packit Service 639957
(base) class that may be found in the structure, in order to let the
Packit Service 639957
methods replace the objects with whatever scalar values the methods
Packit Service 639957
return.
Packit Service 639957
Packit Service 639957
If you need to serialise data structures that may contain arbitrary
Packit Service 639957
objects, it's probably better to use other serialisers (such as
Packit Service 639957
L<Sereal> or L<Storable> for example), but if you do want to use
Packit Service 639957
this module for that purpose, C<-convert_blessed_universally> option
Packit Service 639957
may help, which tweaks C<encode> method of the backend to install
Packit Service 639957
C<UNIVERSAL::TO_JSON> method (locally) before encoding, so that
Packit Service 639957
all the objects that don't have their own C<TO_JSON> method can
Packit Service 639957
fall back on the method in the C<UNIVERSAL> namespace. Note that you
Packit Service 639957
still need to enable C<convert_blessed> flag to actually encode
Packit Service 639957
objects in a data structure, and C<UNIVERSAL::TO_JSON> method
Packit Service 639957
installed by this option only converts blessed hash/array references
Packit Service 639957
into their unblessed clone (including private keys/values that are
Packit Service 639957
not supposed to be exposed). Other blessed references will be
Packit Service 639957
converted into null.
Packit Service 639957
Packit Service 639957
This feature is experimental and may be removed in the future.
Packit Service 639957
Packit Service 639957
=item -no_export
Packit Service 639957
Packit Service 639957
When you don't want to import functional interfaces from a module, you
Packit Service 639957
usually supply C<()> to its C<use> statement.
Packit Service 639957
Packit Service 639957
    use JSON (); # no functional interfaces
Packit Service 639957
Packit Service 639957
If you don't want to import functional interfaces, but you also want to
Packit Service 639957
use any of the above options, add C<-no_export> to the option list.
Packit Service 639957
Packit Service 639957
   # no functional interfaces, while JSON::PP support is enabled.
Packit Service 639957
   use JSON -support_by_pp, -no_export;
Packit Service 639957
Packit Service 639957
=back
Packit Service 639957
Packit Service 639957
=head1 FUNCTIONAL INTERFACE
Packit Service 639957
Packit Service 639957
This section is taken from JSON::XS. C<encode_json> and C<decode_json>
Packit Service 639957
are exported by default.
Packit Service 639957
Packit Service 639957
This module also exports C<to_json> and C<from_json> for backward
Packit Service 639957
compatibility. These are slower, and may expect/generate different stuff
Packit Service 639957
from what C<encode_json> and C<decode_json> do, depending on their
Packit Service 639957
options. It's better just to use Object-Oriented interfaces than using
Packit Service 639957
these two functions.
Packit Service 639957
Packit Service 639957
=head2 encode_json
Packit Service 639957
Packit Service 639957
    $json_text = encode_json $perl_scalar
Packit Service 639957
Packit Service 639957
Converts the given Perl data structure to a UTF-8 encoded, binary string
Packit Service 639957
(that is, the string contains octets only). Croaks on error.
Packit Service 639957
Packit Service 639957
This function call is functionally identical to:
Packit Service 639957
Packit Service 639957
    $json_text = JSON->new->utf8->encode($perl_scalar)
Packit Service 639957
Packit Service 639957
Except being faster.
Packit Service 639957
Packit Service 639957
=head2 decode_json
Packit Service 639957
Packit Service 639957
    $perl_scalar = decode_json $json_text
Packit Service 639957
Packit Service 639957
The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
Packit Service 639957
to parse that as an UTF-8 encoded JSON text, returning the resulting
Packit Service 639957
reference. Croaks on error.
Packit Service 639957
Packit Service 639957
This function call is functionally identical to:
Packit Service 639957
Packit Service 639957
    $perl_scalar = JSON->new->utf8->decode($json_text)
Packit Service 639957
Packit Service 639957
Except being faster.
Packit Service 639957
Packit Service 639957
=head2 to_json
Packit Service 639957
Packit Service 639957
   $json_text = to_json($perl_scalar[, $optional_hashref])
Packit Service 639957
Packit Service 639957
Converts the given Perl data structure to a Unicode string by default.
Packit Service 639957
Croaks on error.
Packit Service 639957
Packit Service 639957
Basically, this function call is functionally identical to:
Packit Service 639957
Packit Service 639957
   $json_text = JSON->new->encode($perl_scalar)
Packit Service 639957
Packit Service 639957
Except being slower.
Packit Service 639957
Packit Service 639957
You can pass an optional hash reference to modify its behavior, but
Packit Service 639957
that may change what C<to_json> expects/generates (see
Packit Service 639957
C<ENCODING/CODESET FLAG NOTES> for details).
Packit Service 639957
Packit Service 639957
   $json_text = to_json($perl_scalar, {utf8 => 1, pretty => 1})
Packit Service 639957
   # => JSON->new->utf8(1)->pretty(1)->encode($perl_scalar)
Packit Service 639957
Packit Service 639957
=head2 from_json
Packit Service 639957
Packit Service 639957
   $perl_scalar = from_json($json_text[, $optional_hashref])
Packit Service 639957
Packit Service 639957
The opposite of C<to_json>: expects a Unicode string and tries
Packit Service 639957
to parse it, returning the resulting reference. Croaks on error.
Packit Service 639957
Packit Service 639957
Basically, this function call is functionally identical to:
Packit Service 639957
Packit Service 639957
    $perl_scalar = JSON->new->decode($json_text)
Packit Service 639957
Packit Service 639957
You can pass an optional hash reference to modify its behavior, but
Packit Service 639957
that may change what C<from_json> expects/generates (see
Packit Service 639957
C<ENCODING/CODESET FLAG NOTES> for details).
Packit Service 639957
Packit Service 639957
    $perl_scalar = from_json($json_text, {utf8 => 1})
Packit Service 639957
    # => JSON->new->utf8(1)->decode($json_text)
Packit Service 639957
Packit Service 639957
=head2 JSON::is_bool
Packit Service 639957
Packit Service 639957
    $is_boolean = JSON::is_bool($scalar)
Packit Service 639957
Packit Service 639957
Returns true if the passed scalar represents either JSON::true or
Packit Service 639957
JSON::false, two constants that act like C<1> and C<0> respectively
Packit Service 639957
and are also used to represent JSON C<true> and C<false> in Perl strings.
Packit Service 639957
Packit Service 639957
See L<MAPPING>, below, for more information on how JSON values are mapped to
Packit Service 639957
Perl.
Packit Service 639957
Packit Service 639957
=head1 COMMON OBJECT-ORIENTED INTERFACE
Packit Service 639957
Packit Service 639957
This section is also taken from JSON::XS.
Packit Service 639957
Packit Service 639957
The object oriented interface lets you configure your own encoding or
Packit Service 639957
decoding style, within the limits of supported formats.
Packit Service 639957
Packit Service 639957
=head2 new
Packit Service 639957
Packit Service 639957
    $json = JSON->new
Packit Service 639957
Packit Service 639957
Creates a new JSON::XS-compatible backend object that can be used to de/encode JSON
Packit Service 639957
strings. All boolean flags described below are by default I<disabled>.
Packit Service 639957
Packit Service 639957
The mutators for flags all return the backend object again and thus calls can
Packit Service 639957
be chained:
Packit Service 639957
Packit Service 639957
   my $json = JSON->new->utf8->space_after->encode({a => [1,2]})
Packit Service 639957
   => {"a": [1, 2]}
Packit Service 639957
Packit Service 639957
=head2 ascii
Packit Service 639957
Packit Service 639957
    $json = $json->ascii([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_ascii
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will not
Packit Service 639957
generate characters outside the code range C<0..127> (which is ASCII). Any
Packit Service 639957
Unicode characters outside that range will be escaped using either a
Packit Service 639957
single \uXXXX (BMP characters) or a double \uHHHH\uLLLLL escape sequence,
Packit Service 639957
as per RFC4627. The resulting encoded JSON text can be treated as a native
Packit Service 639957
Unicode string, an ascii-encoded, latin1-encoded or UTF-8 encoded string,
Packit Service 639957
or any other superset of ASCII.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, then the C<encode> method will not escape Unicode
Packit Service 639957
characters unless required by the JSON syntax or other flags. This results
Packit Service 639957
in a faster and more compact format.
Packit Service 639957
Packit Service 639957
See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
Packit Service 639957
Packit Service 639957
The main use for this flag is to produce JSON texts that can be
Packit Service 639957
transmitted over a 7-bit channel, as the encoded JSON texts will not
Packit Service 639957
contain any 8 bit characters.
Packit Service 639957
Packit Service 639957
  JSON->new->ascii(1)->encode([chr 0x10401])
Packit Service 639957
  => ["\ud801\udc01"]
Packit Service 639957
Packit Service 639957
=head2 latin1
Packit Service 639957
Packit Service 639957
    $json = $json->latin1([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_latin1
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will encode
Packit Service 639957
the resulting JSON text as latin1 (or iso-8859-1), escaping any characters
Packit Service 639957
outside the code range C<0..255>. The resulting string can be treated as a
Packit Service 639957
latin1-encoded JSON text or a native Unicode string. The C<decode> method
Packit Service 639957
will not be affected in any way by this flag, as C<decode> by default
Packit Service 639957
expects Unicode, which is a strict superset of latin1.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, then the C<encode> method will not escape Unicode
Packit Service 639957
characters unless required by the JSON syntax or other flags.
Packit Service 639957
Packit Service 639957
See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
Packit Service 639957
Packit Service 639957
The main use for this flag is efficiently encoding binary data as JSON
Packit Service 639957
text, as most octets will not be escaped, resulting in a smaller encoded
Packit Service 639957
size. The disadvantage is that the resulting JSON text is encoded
Packit Service 639957
in latin1 (and must correctly be treated as such when storing and
Packit Service 639957
transferring), a rare encoding for JSON. It is therefore most useful when
Packit Service 639957
you want to store data structures known to contain binary data efficiently
Packit Service 639957
in files or databases, not when talking to other JSON encoders/decoders.
Packit Service 639957
Packit Service 639957
  JSON->new->latin1->encode (["\x{89}\x{abc}"]
Packit Service 639957
  => ["\x{89}\\u0abc"]    # (perl syntax, U+abc escaped, U+89 not)
Packit Service 639957
Packit Service 639957
=head2 utf8
Packit Service 639957
Packit Service 639957
    $json = $json->utf8([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_utf8
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will encode
Packit Service 639957
the JSON result into UTF-8, as required by many protocols, while the
Packit Service 639957
C<decode> method expects to be handled an UTF-8-encoded string.  Please
Packit Service 639957
note that UTF-8-encoded strings do not contain any characters outside the
Packit Service 639957
range C<0..255>, they are thus useful for bytewise/binary I/O. In future
Packit Service 639957
versions, enabling this option might enable autodetection of the UTF-16
Packit Service 639957
and UTF-32 encoding families, as described in RFC4627.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, then the C<encode> method will return the JSON
Packit Service 639957
string as a (non-encoded) Unicode string, while C<decode> expects thus a
Packit Service 639957
Unicode string.  Any decoding or encoding (e.g. to UTF-8 or UTF-16) needs
Packit Service 639957
to be done yourself, e.g. using the Encode module.
Packit Service 639957
Packit Service 639957
See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
Packit Service 639957
Packit Service 639957
Example, output UTF-16BE-encoded JSON:
Packit Service 639957
Packit Service 639957
  use Encode;
Packit Service 639957
  $jsontext = encode "UTF-16BE", JSON->new->encode ($object);
Packit Service 639957
Packit Service 639957
Example, decode UTF-32LE-encoded JSON:
Packit Service 639957
Packit Service 639957
  use Encode;
Packit Service 639957
  $object = JSON->new->decode (decode "UTF-32LE", $jsontext);
Packit Service 639957
Packit Service 639957
=head2 pretty
Packit Service 639957
Packit Service 639957
    $json = $json->pretty([$enable])
Packit Service 639957
Packit Service 639957
This enables (or disables) all of the C<indent>, C<space_before> and
Packit Service 639957
C<space_after> (and in the future possibly more) flags in one call to
Packit Service 639957
generate the most readable (or most compact) form possible.
Packit Service 639957
Packit Service 639957
=head2 indent
Packit Service 639957
Packit Service 639957
    $json = $json->indent([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_indent
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will use a multiline
Packit Service 639957
format as output, putting every array member or object/hash key-value pair
Packit Service 639957
into its own line, indenting them properly.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, no newlines or indenting will be produced, and the
Packit Service 639957
resulting JSON text is guaranteed not to contain any C<newlines>.
Packit Service 639957
Packit Service 639957
This setting has no effect when decoding JSON texts.
Packit Service 639957
Packit Service 639957
=head2 space_before
Packit Service 639957
Packit Service 639957
    $json = $json->space_before([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_space_before
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will add an extra
Packit Service 639957
optional space before the C<:> separating keys from values in JSON objects.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, then the C<encode> method will not add any extra
Packit Service 639957
space at those places.
Packit Service 639957
Packit Service 639957
This setting has no effect when decoding JSON texts. You will also
Packit Service 639957
most likely combine this setting with C<space_after>.
Packit Service 639957
Packit Service 639957
Example, space_before enabled, space_after and indent disabled:
Packit Service 639957
Packit Service 639957
   {"key" :"value"}
Packit Service 639957
Packit Service 639957
=head2 space_after
Packit Service 639957
Packit Service 639957
    $json = $json->space_after([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_space_after
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will add an extra
Packit Service 639957
optional space after the C<:> separating keys from values in JSON objects
Packit Service 639957
and extra whitespace after the C<,> separating key-value pairs and array
Packit Service 639957
members.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, then the C<encode> method will not add any extra
Packit Service 639957
space at those places.
Packit Service 639957
Packit Service 639957
This setting has no effect when decoding JSON texts.
Packit Service 639957
Packit Service 639957
Example, space_before and indent disabled, space_after enabled:
Packit Service 639957
Packit Service 639957
   {"key": "value"}
Packit Service 639957
Packit Service 639957
=head2 relaxed
Packit Service 639957
Packit Service 639957
    $json = $json->relaxed([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_relaxed
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then C<decode> will accept some
Packit Service 639957
extensions to normal JSON syntax (see below). C<encode> will not be
Packit Service 639957
affected in anyway. I
Packit Service 639957
JSON texts as if they were valid!>. I suggest only to use this option to
Packit Service 639957
parse application-specific files written by humans (configuration files,
Packit Service 639957
resource files etc.)
Packit Service 639957
Packit Service 639957
If C<$enable> is false (the default), then C<decode> will only accept
Packit Service 639957
valid JSON texts.
Packit Service 639957
Packit Service 639957
Currently accepted extensions are:
Packit Service 639957
Packit Service 639957
=over 4
Packit Service 639957
Packit Service 639957
=item * list items can have an end-comma
Packit Service 639957
Packit Service 639957
JSON I<separates> array elements and key-value pairs with commas. This
Packit Service 639957
can be annoying if you write JSON texts manually and want to be able to
Packit Service 639957
quickly append elements, so this extension accepts comma at the end of
Packit Service 639957
such items not just between them:
Packit Service 639957
Packit Service 639957
   [
Packit Service 639957
      1,
Packit Service 639957
      2, <- this comma not normally allowed
Packit Service 639957
   ]
Packit Service 639957
   {
Packit Service 639957
      "k1": "v1",
Packit Service 639957
      "k2": "v2", <- this comma not normally allowed
Packit Service 639957
   }
Packit Service 639957
Packit Service 639957
=item * shell-style '#'-comments
Packit Service 639957
Packit Service 639957
Whenever JSON allows whitespace, shell-style comments are additionally
Packit Service 639957
allowed. They are terminated by the first carriage-return or line-feed
Packit Service 639957
character, after which more white-space and comments are allowed.
Packit Service 639957
Packit Service 639957
  [
Packit Service 639957
     1, # this comment not allowed in JSON
Packit Service 639957
        # neither this one...
Packit Service 639957
  ]
Packit Service 639957
Packit Service 639957
=back
Packit Service 639957
Packit Service 639957
=head2 canonical
Packit Service 639957
Packit Service 639957
    $json = $json->canonical([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_canonical
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
Packit Service 639957
by sorting their keys. This is adding a comparatively high overhead.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, then the C<encode> method will output key-value
Packit Service 639957
pairs in the order Perl stores them (which will likely change between runs
Packit Service 639957
of the same script, and can change even within the same run from 5.18
Packit Service 639957
onwards).
Packit Service 639957
Packit Service 639957
This option is useful if you want the same data structure to be encoded as
Packit Service 639957
the same JSON text (given the same overall settings). If it is disabled,
Packit Service 639957
the same hash might be encoded differently even if contains the same data,
Packit Service 639957
as key-value pairs have no inherent ordering in Perl.
Packit Service 639957
Packit Service 639957
This setting has no effect when decoding JSON texts.
Packit Service 639957
Packit Service 639957
This setting has currently no effect on tied hashes.
Packit Service 639957
Packit Service 639957
=head2 allow_nonref
Packit Service 639957
Packit Service 639957
    $json = $json->allow_nonref([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_allow_nonref
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method can convert a
Packit Service 639957
non-reference into its corresponding string, number or null JSON value,
Packit Service 639957
which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
Packit Service 639957
values instead of croaking.
Packit Service 639957
Packit Service 639957
If C<$enable> is false, then the C<encode> method will croak if it isn't
Packit Service 639957
passed an arrayref or hashref, as JSON texts must either be an object
Packit Service 639957
or array. Likewise, C<decode> will croak if given something that is not a
Packit Service 639957
JSON object or array.
Packit Service 639957
Packit Service 639957
Example, encode a Perl scalar as JSON value with enabled C<allow_nonref>,
Packit Service 639957
resulting in an invalid JSON text:
Packit Service 639957
Packit Service 639957
   JSON->new->allow_nonref->encode ("Hello, World!")
Packit Service 639957
   => "Hello, World!"
Packit Service 639957
Packit Service 639957
=head2 allow_unknown
Packit Service 639957
Packit Service 639957
    $json = $json->allow_unknown ([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_allow_unknown
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then C<encode> will I<not> throw an
Packit Service 639957
exception when it encounters values it cannot represent in JSON (for
Packit Service 639957
example, filehandles) but instead will encode a JSON C<null> value. Note
Packit Service 639957
that blessed objects are not included here and are handled separately by
Packit Service 639957
c<allow_nonref>.
Packit Service 639957
Packit Service 639957
If C<$enable> is false (the default), then C<encode> will throw an
Packit Service 639957
exception when it encounters anything it cannot encode as JSON.
Packit Service 639957
Packit Service 639957
This option does not affect C<decode> in any way, and it is recommended to
Packit Service 639957
leave it off unless you know your communications partner.
Packit Service 639957
Packit Service 639957
=head2 allow_blessed
Packit Service 639957
Packit Service 639957
    $json = $json->allow_blessed([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_allow_blessed
Packit Service 639957
Packit Service 639957
See L<OBJECT SERIALISATION> for details.
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then the C<encode> method will not
Packit Service 639957
barf when it encounters a blessed reference that it cannot convert
Packit Service 639957
otherwise. Instead, a JSON C<null> value is encoded instead of the object.
Packit Service 639957
Packit Service 639957
If C<$enable> is false (the default), then C<encode> will throw an
Packit Service 639957
exception when it encounters a blessed object that it cannot convert
Packit Service 639957
otherwise.
Packit Service 639957
Packit Service 639957
This setting has no effect on C<decode>.
Packit Service 639957
Packit Service 639957
=head2 convert_blessed
Packit Service 639957
Packit Service 639957
    $json = $json->convert_blessed([$enable])
Packit Service 639957
    
Packit Service 639957
    $enabled = $json->get_convert_blessed
Packit Service 639957
Packit Service 639957
See L<OBJECT SERIALISATION> for details.
Packit Service 639957
Packit Service 639957
If C<$enable> is true (or missing), then C<encode>, upon encountering a
Packit Service 639957
blessed object, will check for the availability of the C<TO_JSON> method
Packit Service 639957
on the object's class. If found, it will be called in scalar context and
Packit Service 639957
the resulting scalar will be encoded instead of the object.
Packit Service 639957
Packit Service 639957
The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
Packit Service 639957
returns other blessed objects, those will be handled in the same
Packit Service 639957
way. C<TO_JSON> must take care of not causing an endless recursion cycle
Packit Service 639957
(== crash) in this case. The name of C<TO_JSON> was chosen because other
Packit Service 639957
methods called by the Perl core (== not by the user of the object) are
Packit Service 639957
usually in upper case letters and to avoid collisions with any C<to_json>
Packit Service 639957
function or method.
Packit Service 639957
Packit Service 639957
If C<$enable> is false (the default), then C<encode> will not consider
Packit Service 639957
this type of conversion.
Packit Service 639957
Packit Service 639957
This setting has no effect on C<decode>.
Packit Service 639957
Packit Service 639957
=head2 filter_json_object
Packit Service 639957
Packit Service 639957
    $json = $json->filter_json_object([$coderef])
Packit Service 639957
Packit Service 639957
When C<$coderef> is specified, it will be called from C<decode> each
Packit Service 639957
time it decodes a JSON object. The only argument is a reference to the
Packit Service 639957
newly-created hash. If the code references returns a single scalar (which
Packit Service 639957
need not be a reference), this value (i.e. a copy of that scalar to avoid
Packit Service 639957
aliasing) is inserted into the deserialised data structure. If it returns
Packit Service 639957
an empty list (NOTE: I<not> C<undef>, which is a valid scalar), the
Packit Service 639957
original deserialised hash will be inserted. This setting can slow down
Packit Service 639957
decoding considerably.
Packit Service 639957
Packit Service 639957
When C<$coderef> is omitted or undefined, any existing callback will
Packit Service 639957
be removed and C<decode> will not change the deserialised hash in any
Packit Service 639957
way.
Packit Service 639957
Packit Service 639957
Example, convert all JSON objects into the integer 5:
Packit Service 639957
Packit Service 639957
   my $js = JSON->new->filter_json_object (sub { 5 });
Packit Service 639957
   # returns [5]
Packit Service 639957
   $js->decode ('[{}]'); # the given subroutine takes a hash reference.
Packit Service 639957
   # throw an exception because allow_nonref is not enabled
Packit Service 639957
   # so a lone 5 is not allowed.
Packit Service 639957
   $js->decode ('{"a":1, "b":2}');
Packit Service 639957
Packit Service 639957
=head2 filter_json_single_key_object
Packit Service 639957
Packit Service 639957
    $json = $json->filter_json_single_key_object($key [=> $coderef])
Packit Service 639957
Packit Service 639957
Works remotely similar to C<filter_json_object>, but is only called for
Packit Service 639957
JSON objects having a single key named C<$key>.
Packit Service 639957
Packit Service 639957
This C<$coderef> is called before the one specified via
Packit Service 639957
C<filter_json_object>, if any. It gets passed the single value in the JSON
Packit Service 639957
object. If it returns a single value, it will be inserted into the data
Packit Service 639957
structure. If it returns nothing (not even C<undef> but the empty list),
Packit Service 639957
the callback from C<filter_json_object> will be called next, as if no
Packit Service 639957
single-key callback were specified.
Packit Service 639957
Packit Service 639957
If C<$coderef> is omitted or undefined, the corresponding callback will be
Packit Service 639957
disabled. There can only ever be one callback for a given key.
Packit Service 639957
Packit Service 639957
As this callback gets called less often then the C<filter_json_object>
Packit Service 639957
one, decoding speed will not usually suffer as much. Therefore, single-key
Packit Service 639957
objects make excellent targets to serialise Perl objects into, especially
Packit Service 639957
as single-key JSON objects are as close to the type-tagged value concept
Packit Service 639957
as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
Packit Service 639957
support this in any way, so you need to make sure your data never looks
Packit Service 639957
like a serialised Perl hash.
Packit Service 639957
Packit Service 639957
Typical names for the single object key are C<__class_whatever__>, or
Packit Service 639957
C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
Packit Service 639957
things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
Packit Service 639957
with real hashes.
Packit Service 639957
Packit Service 639957
Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
Packit Service 639957
into the corresponding C<< $WIDGET{<id>} >> object:
Packit Service 639957
Packit Service 639957
   # return whatever is in $WIDGET{5}:
Packit Service 639957
   JSON
Packit Service 639957
      ->new
Packit Service 639957
      ->filter_json_single_key_object (__widget__ => sub {
Packit Service 639957
            $WIDGET{ $_[0] }
Packit Service 639957
         })
Packit Service 639957
      ->decode ('{"__widget__": 5')
Packit Service 639957
Packit Service 639957
   # this can be used with a TO_JSON method in some "widget" class
Packit Service 639957
   # for serialisation to json:
Packit Service 639957
   sub WidgetBase::TO_JSON {
Packit Service 639957
      my ($self) = @_;
Packit Service 639957
Packit Service 639957
      unless ($self->{id}) {
Packit Service 639957
         $self->{id} = ..get..some..id..;
Packit Service 639957
         $WIDGET{$self->{id}} = $self;
Packit Service 639957
      }
Packit Service 639957
Packit Service 639957
      { __widget__ => $self->{id} }
Packit Service 639957
   }
Packit Service 639957
Packit Service 639957
=head2 max_depth
Packit Service 639957
Packit Service 639957
    $json = $json->max_depth([$maximum_nesting_depth])
Packit Service 639957
    
Packit Service 639957
    $max_depth = $json->get_max_depth
Packit Service 639957
Packit Service 639957
Sets the maximum nesting level (default C<512>) accepted while encoding
Packit Service 639957
or decoding. If a higher nesting level is detected in JSON text or a Perl
Packit Service 639957
data structure, then the encoder and decoder will stop and croak at that
Packit Service 639957
point.
Packit Service 639957
Packit Service 639957
Nesting level is defined by number of hash- or arrayrefs that the encoder
Packit Service 639957
needs to traverse to reach a given point or the number of C<{> or C<[>
Packit Service 639957
characters without their matching closing parenthesis crossed to reach a
Packit Service 639957
given character in a string.
Packit Service 639957
Packit Service 639957
Setting the maximum depth to one disallows any nesting, so that ensures
Packit Service 639957
that the object is only a single hash/object or array.
Packit Service 639957
Packit Service 639957
If no argument is given, the highest possible setting will be used, which
Packit Service 639957
is rarely useful.
Packit Service 639957
Packit Service 639957
=head2 max_size
Packit Service 639957
Packit Service 639957
    $json = $json->max_size([$maximum_string_size])
Packit Service 639957
    
Packit Service 639957
    $max_size = $json->get_max_size
Packit Service 639957
Packit Service 639957
Set the maximum length a JSON text may have (in bytes) where decoding is
Packit Service 639957
being attempted. The default is C<0>, meaning no limit. When C<decode>
Packit Service 639957
is called on a string that is longer then this many bytes, it will not
Packit Service 639957
attempt to decode the string but throw an exception. This setting has no
Packit Service 639957
effect on C<encode> (yet).
Packit Service 639957
Packit Service 639957
If no argument is given, the limit check will be deactivated (same as when
Packit Service 639957
C<0> is specified).
Packit Service 639957
Packit Service 639957
=head2 encode
Packit Service 639957
Packit Service 639957
    $json_text = $json->encode($perl_scalar)
Packit Service 639957
Packit Service 639957
Converts the given Perl value or data structure to its JSON
Packit Service 639957
representation. Croaks on error.
Packit Service 639957
Packit Service 639957
=head2 decode
Packit Service 639957
Packit Service 639957
    $perl_scalar = $json->decode($json_text)
Packit Service 639957
Packit Service 639957
The opposite of C<encode>: expects a JSON text and tries to parse it,
Packit Service 639957
returning the resulting simple scalar or reference. Croaks on error.
Packit Service 639957
Packit Service 639957
=head2 decode_prefix
Packit Service 639957
Packit Service 639957
    ($perl_scalar, $characters) = $json->decode_prefix($json_text)
Packit Service 639957
Packit Service 639957
This works like the C<decode> method, but instead of raising an exception
Packit Service 639957
when there is trailing garbage after the first JSON object, it will
Packit Service 639957
silently stop parsing there and return the number of characters consumed
Packit Service 639957
so far.
Packit Service 639957
Packit Service 639957
This is useful if your JSON texts are not delimited by an outer protocol
Packit Service 639957
and you need to know where the JSON text ends.
Packit Service 639957
Packit Service 639957
   JSON->new->decode_prefix ("[1] the tail")
Packit Service 639957
   => ([1], 3)
Packit Service 639957
Packit Service 639957
=head1 ADDITIONAL METHODS
Packit Service 639957
Packit Service 639957
The following methods are for this module only.
Packit Service 639957
Packit Service 639957
=head2 backend
Packit Service 639957
Packit Service 639957
    $backend = $json->backend
Packit Service 639957
Packit Service 639957
Since 2.92, C<backend> method returns an abstract backend module used currently,
Packit Service 639957
which should be JSON::Backend::XS (which inherits JSON::XS or Cpanel::JSON::XS),
Packit Service 639957
or JSON::Backend::PP (which inherits JSON::PP), not to monkey-patch the actual
Packit Service 639957
backend module globally.
Packit Service 639957
Packit Service 639957
If you need to know what is used actually, use C<isa>, instead of string comparison.
Packit Service 639957
Packit Service 639957
=head2 is_xs
Packit Service 639957
Packit Service 639957
    $boolean = $json->is_xs
Packit Service 639957
Packit Service 639957
Returns true if the backend inherits JSON::XS or Cpanel::JSON::XS.
Packit Service 639957
Packit Service 639957
=head2 is_pp
Packit Service 639957
Packit Service 639957
    $boolean = $json->is_pp
Packit Service 639957
Packit Service 639957
Returns true if the backend inherits JSON::PP.
Packit Service 639957
Packit Service 639957
=head2 property
Packit Service 639957
Packit Service 639957
    $settings = $json->property()
Packit Service 639957
Packit Service 639957
Returns a reference to a hash that holds all the common flag settings.
Packit Service 639957
Packit Service 639957
    $json = $json->property('utf8' => 1)
Packit Service 639957
    $value = $json->property('utf8') # 1
Packit Service 639957
Packit Service 639957
You can use this to get/set a value of a particular flag.
Packit Service 639957
Packit Service 639957
=head1 INCREMENTAL PARSING
Packit Service 639957
Packit Service 639957
This section is also taken from JSON::XS.
Packit Service 639957
Packit Service 639957
In some cases, there is the need for incremental parsing of JSON
Packit Service 639957
texts. While this module always has to keep both JSON text and resulting
Packit Service 639957
Perl data structure in memory at one time, it does allow you to parse a
Packit Service 639957
JSON stream incrementally. It does so by accumulating text until it has
Packit Service 639957
a full JSON object, which it then can decode. This process is similar to
Packit Service 639957
using C<decode_prefix> to see if a full JSON object is available, but
Packit Service 639957
is much more efficient (and can be implemented with a minimum of method
Packit Service 639957
calls).
Packit Service 639957
Packit Service 639957
This module will only attempt to parse the JSON text once it is sure it
Packit Service 639957
has enough text to get a decisive result, using a very simple but
Packit Service 639957
truly incremental parser. This means that it sometimes won't stop as
Packit Service 639957
early as the full parser, for example, it doesn't detect mismatched
Packit Service 639957
parentheses. The only thing it guarantees is that it starts decoding as
Packit Service 639957
soon as a syntactically valid JSON text has been seen. This means you need
Packit Service 639957
to set resource limits (e.g. C<max_size>) to ensure the parser will stop
Packit Service 639957
parsing in the presence if syntax errors.
Packit Service 639957
Packit Service 639957
The following methods implement this incremental parser.
Packit Service 639957
Packit Service 639957
=head2 incr_parse
Packit Service 639957
Packit Service 639957
    $json->incr_parse( [$string] ) # void context
Packit Service 639957
    
Packit Service 639957
    $obj_or_undef = $json->incr_parse( [$string] ) # scalar context
Packit Service 639957
    
Packit Service 639957
    @obj_or_empty = $json->incr_parse( [$string] ) # list context
Packit Service 639957
Packit Service 639957
This is the central parsing function. It can both append new text and
Packit Service 639957
extract objects from the stream accumulated so far (both of these
Packit Service 639957
functions are optional).
Packit Service 639957
Packit Service 639957
If C<$string> is given, then this string is appended to the already
Packit Service 639957
existing JSON fragment stored in the C<$json> object.
Packit Service 639957
Packit Service 639957
After that, if the function is called in void context, it will simply
Packit Service 639957
return without doing anything further. This can be used to add more text
Packit Service 639957
in as many chunks as you want.
Packit Service 639957
Packit Service 639957
If the method is called in scalar context, then it will try to extract
Packit Service 639957
exactly I<one> JSON object. If that is successful, it will return this
Packit Service 639957
object, otherwise it will return C<undef>. If there is a parse error,
Packit Service 639957
this method will croak just as C<decode> would do (one can then use
Packit Service 639957
C<incr_skip> to skip the erroneous part). This is the most common way of
Packit Service 639957
using the method.
Packit Service 639957
Packit Service 639957
And finally, in list context, it will try to extract as many objects
Packit Service 639957
from the stream as it can find and return them, or the empty list
Packit Service 639957
otherwise. For this to work, there must be no separators (other than
Packit Service 639957
whitespace) between the JSON objects or arrays, instead they must be
Packit Service 639957
concatenated back-to-back. If an error occurs, an exception will be
Packit Service 639957
raised as in the scalar context case. Note that in this case, any
Packit Service 639957
previously-parsed JSON texts will be lost.
Packit Service 639957
Packit Service 639957
Example: Parse some JSON arrays/objects in a given string and return
Packit Service 639957
them.
Packit Service 639957
Packit Service 639957
    my @objs = JSON->new->incr_parse ("[5][7][1,2]");
Packit Service 639957
Packit Service 639957
=head2 incr_text
Packit Service 639957
Packit Service 639957
    $lvalue_string = $json->incr_text
Packit Service 639957
Packit Service 639957
This method returns the currently stored JSON fragment as an lvalue, that
Packit Service 639957
is, you can manipulate it. This I<only> works when a preceding call to
Packit Service 639957
C<incr_parse> in I<scalar context> successfully returned an object. Under
Packit Service 639957
all other circumstances you must not call this function (I mean it.
Packit Service 639957
although in simple tests it might actually work, it I<will> fail under
Packit Service 639957
real world conditions). As a special exception, you can also call this
Packit Service 639957
method before having parsed anything.
Packit Service 639957
Packit Service 639957
That means you can only use this function to look at or manipulate text
Packit Service 639957
before or after complete JSON objects, not while the parser is in the
Packit Service 639957
middle of parsing a JSON object.
Packit Service 639957
Packit Service 639957
This function is useful in two cases: a) finding the trailing text after a
Packit Service 639957
JSON object or b) parsing multiple JSON objects separated by non-JSON text
Packit Service 639957
(such as commas).
Packit Service 639957
Packit Service 639957
=head2 incr_skip
Packit Service 639957
Packit Service 639957
    $json->incr_skip
Packit Service 639957
Packit Service 639957
This will reset the state of the incremental parser and will remove
Packit Service 639957
the parsed text from the input buffer so far. This is useful after
Packit Service 639957
C<incr_parse> died, in which case the input buffer and incremental parser
Packit Service 639957
state is left unchanged, to skip the text parsed so far and to reset the
Packit Service 639957
parse state.
Packit Service 639957
Packit Service 639957
The difference to C<incr_reset> is that only text until the parse error
Packit Service 639957
occurred is removed.
Packit Service 639957
Packit Service 639957
=head2 incr_reset
Packit Service 639957
Packit Service 639957
    $json->incr_reset
Packit Service 639957
Packit Service 639957
This completely resets the incremental parser, that is, after this call,
Packit Service 639957
it will be as if the parser had never parsed anything.
Packit Service 639957
Packit Service 639957
This is useful if you want to repeatedly parse JSON objects and want to
Packit Service 639957
ignore any trailing data, which means you have to reset the parser after
Packit Service 639957
each successful decode.
Packit Service 639957
Packit Service 639957
=head1 MAPPING
Packit Service 639957
Packit Service 639957
Most of this section is also taken from JSON::XS.
Packit Service 639957
Packit Service 639957
This section describes how the backend modules map Perl values to JSON values and
Packit Service 639957
vice versa. These mappings are designed to "do the right thing" in most
Packit Service 639957
circumstances automatically, preserving round-tripping characteristics
Packit Service 639957
(what you put in comes out as something equivalent).
Packit Service 639957
Packit Service 639957
For the more enlightened: note that in the following descriptions,
Packit Service 639957
lowercase I<perl> refers to the Perl interpreter, while uppercase I<Perl>
Packit Service 639957
refers to the abstract Perl language itself.
Packit Service 639957
Packit Service 639957
=head2 JSON -> PERL
Packit Service 639957
Packit Service 639957
=over 4
Packit Service 639957
Packit Service 639957
=item object
Packit Service 639957
Packit Service 639957
A JSON object becomes a reference to a hash in Perl. No ordering of object
Packit Service 639957
keys is preserved (JSON does not preserver object key ordering itself).
Packit Service 639957
Packit Service 639957
=item array
Packit Service 639957
Packit Service 639957
A JSON array becomes a reference to an array in Perl.
Packit Service 639957
Packit Service 639957
=item string
Packit Service 639957
Packit Service 639957
A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
Packit Service 639957
are represented by the same codepoints in the Perl string, so no manual
Packit Service 639957
decoding is necessary.
Packit Service 639957
Packit Service 639957
=item number
Packit Service 639957
Packit Service 639957
A JSON number becomes either an integer, numeric (floating point) or
Packit Service 639957
string scalar in perl, depending on its range and any fractional parts. On
Packit Service 639957
the Perl level, there is no difference between those as Perl handles all
Packit Service 639957
the conversion details, but an integer may take slightly less memory and
Packit Service 639957
might represent more values exactly than floating point numbers.
Packit Service 639957
Packit Service 639957
If the number consists of digits only, this module will try to represent
Packit Service 639957
it as an integer value. If that fails, it will try to represent it as
Packit Service 639957
a numeric (floating point) value if that is possible without loss of
Packit Service 639957
precision. Otherwise it will preserve the number as a string value (in
Packit Service 639957
which case you lose roundtripping ability, as the JSON number will be
Packit Service 639957
re-encoded to a JSON string).
Packit Service 639957
Packit Service 639957
Numbers containing a fractional or exponential part will always be
Packit Service 639957
represented as numeric (floating point) values, possibly at a loss of
Packit Service 639957
precision (in which case you might lose perfect roundtripping ability, but
Packit Service 639957
the JSON number will still be re-encoded as a JSON number).
Packit Service 639957
Packit Service 639957
Note that precision is not accuracy - binary floating point values cannot
Packit Service 639957
represent most decimal fractions exactly, and when converting from and to
Packit Service 639957
floating point, this module only guarantees precision up to but not including
Packit Service 639957
the least significant bit.
Packit Service 639957
Packit Service 639957
=item true, false
Packit Service 639957
Packit Service 639957
These JSON atoms become C<JSON::true> and C<JSON::false>,
Packit Service 639957
respectively. They are overloaded to act almost exactly like the numbers
Packit Service 639957
C<1> and C<0>. You can check whether a scalar is a JSON boolean by using
Packit Service 639957
the C<JSON::is_bool> function.
Packit Service 639957
Packit Service 639957
=item null
Packit Service 639957
Packit Service 639957
A JSON null atom becomes C<undef> in Perl.
Packit Service 639957
Packit Service 639957
=item shell-style comments (C<< # I<text> >>)
Packit Service 639957
Packit Service 639957
As a nonstandard extension to the JSON syntax that is enabled by the
Packit Service 639957
C<relaxed> setting, shell-style comments are allowed. They can start
Packit Service 639957
anywhere outside strings and go till the end of the line.
Packit Service 639957
Packit Service 639957
=back
Packit Service 639957
Packit Service 639957
Packit Service 639957
=head2 PERL -> JSON
Packit Service 639957
Packit Service 639957
The mapping from Perl to JSON is slightly more difficult, as Perl is a
Packit Service 639957
truly typeless language, so we can only guess which JSON type is meant by
Packit Service 639957
a Perl value.
Packit Service 639957
Packit Service 639957
=over 4
Packit Service 639957
Packit Service 639957
=item hash references
Packit Service 639957
Packit Service 639957
Perl hash references become JSON objects. As there is no inherent
Packit Service 639957
ordering in hash keys (or JSON objects), they will usually be encoded
Packit Service 639957
in a pseudo-random order. This module can optionally sort the hash keys
Packit Service 639957
(determined by the I<canonical> flag), so the same data structure will
Packit Service 639957
serialise to the same JSON text (given same settings and version of
Packit Service 639957
the same backend), but this incurs a runtime overhead and is only rarely useful,
Packit Service 639957
e.g. when you want to compare some JSON text against another for equality.
Packit Service 639957
Packit Service 639957
=item array references
Packit Service 639957
Packit Service 639957
Perl array references become JSON arrays.
Packit Service 639957
Packit Service 639957
=item other references
Packit Service 639957
Packit Service 639957
Other unblessed references are generally not allowed and will cause an
Packit Service 639957
exception to be thrown, except for references to the integers C<0> and
Packit Service 639957
C<1>, which get turned into C<false> and C<true> atoms in JSON. You can
Packit Service 639957
also use C<JSON::false> and C<JSON::true> to improve readability.
Packit Service 639957
Packit Service 639957
   encode_json [\0,JSON::true]      # yields [false,true]
Packit Service 639957
Packit Service 639957
=item JSON::true, JSON::false, JSON::null
Packit Service 639957
Packit Service 639957
These special values become JSON true and JSON false values,
Packit Service 639957
respectively. You can also use C<\1> and C<\0> directly if you want.
Packit Service 639957
Packit Service 639957
=item blessed objects
Packit Service 639957
Packit Service 639957
Blessed objects are not directly representable in JSON, but C<JSON::XS>
Packit Service 639957
allows various ways of handling objects. See L<OBJECT SERIALISATION>,
Packit Service 639957
below, for details.
Packit Service 639957
Packit Service 639957
=item simple scalars
Packit Service 639957
Packit Service 639957
Simple Perl scalars (any scalar that is not a reference) are the most
Packit Service 639957
difficult objects to encode: this module will encode undefined scalars as
Packit Service 639957
JSON C<null> values, scalars that have last been used in a string context
Packit Service 639957
before encoding as JSON strings, and anything else as number value:
Packit Service 639957
Packit Service 639957
   # dump as number
Packit Service 639957
   encode_json [2]                      # yields [2]
Packit Service 639957
   encode_json [-3.0e17]                # yields [-3e+17]
Packit Service 639957
   my $value = 5; encode_json [$value]  # yields [5]
Packit Service 639957
Packit Service 639957
   # used as string, so dump as string
Packit Service 639957
   print $value;
Packit Service 639957
   encode_json [$value]                 # yields ["5"]
Packit Service 639957
Packit Service 639957
   # undef becomes null
Packit Service 639957
   encode_json [undef]                  # yields [null]
Packit Service 639957
Packit Service 639957
You can force the type to be a string by stringifying it:
Packit Service 639957
Packit Service 639957
   my $x = 3.1; # some variable containing a number
Packit Service 639957
   "$x";        # stringified
Packit Service 639957
   $x .= "";    # another, more awkward way to stringify
Packit Service 639957
   print $x;    # perl does it for you, too, quite often
Packit Service 639957
Packit Service 639957
You can force the type to be a number by numifying it:
Packit Service 639957
Packit Service 639957
   my $x = "3"; # some variable containing a string
Packit Service 639957
   $x += 0;     # numify it, ensuring it will be dumped as a number
Packit Service 639957
   $x *= 1;     # same thing, the choice is yours.
Packit Service 639957
Packit Service 639957
You can not currently force the type in other, less obscure, ways. Tell me
Packit Service 639957
if you need this capability (but don't forget to explain why it's needed
Packit Service 639957
:).
Packit Service 639957
Packit Service 639957
Note that numerical precision has the same meaning as under Perl (so
Packit Service 639957
binary to decimal conversion follows the same rules as in Perl, which
Packit Service 639957
can differ to other languages). Also, your perl interpreter might expose
Packit Service 639957
extensions to the floating point numbers of your platform, such as
Packit Service 639957
infinities or NaN's - these cannot be represented in JSON, and it is an
Packit Service 639957
error to pass those in.
Packit Service 639957
Packit Service 639957
=back
Packit Service 639957
Packit Service 639957
=head2 OBJECT SERIALISATION
Packit Service 639957
Packit Service 639957
As for Perl objects, this module only supports a pure JSON representation
Packit Service 639957
(without the ability to deserialise the object automatically again).
Packit Service 639957
Packit Service 639957
=head3 SERIALISATION
Packit Service 639957
Packit Service 639957
What happens when this module encounters a Perl object depends on the
Packit Service 639957
C<allow_blessed> and C<convert_blessed> settings, which are used in
Packit Service 639957
this order:
Packit Service 639957
Packit Service 639957
=over 4
Packit Service 639957
Packit Service 639957
=item 1. C<convert_blessed> is enabled and the object has a C<TO_JSON> method.
Packit Service 639957
Packit Service 639957
In this case, the C<TO_JSON> method of the object is invoked in scalar
Packit Service 639957
context. It must return a single scalar that can be directly encoded into
Packit Service 639957
JSON. This scalar replaces the object in the JSON text.
Packit Service 639957
Packit Service 639957
For example, the following C<TO_JSON> method will convert all L<URI>
Packit Service 639957
objects to JSON strings when serialised. The fact that these values
Packit Service 639957
originally were L<URI> objects is lost.
Packit Service 639957
Packit Service 639957
   sub URI::TO_JSON {
Packit Service 639957
      my ($uri) = @_;
Packit Service 639957
      $uri->as_string
Packit Service 639957
   }
Packit Service 639957
Packit Service 639957
=item 2. C<allow_blessed> is enabled.
Packit Service 639957
Packit Service 639957
The object will be serialised as a JSON null value.
Packit Service 639957
Packit Service 639957
=item 3. none of the above
Packit Service 639957
Packit Service 639957
If none of the settings are enabled or the respective methods are missing,
Packit Service 639957
this module throws an exception.
Packit Service 639957
Packit Service 639957
=back
Packit Service 639957
Packit Service 639957
=head1 ENCODING/CODESET FLAG NOTES
Packit Service 639957
Packit Service 639957
This section is taken from JSON::XS.
Packit Service 639957
Packit Service 639957
The interested reader might have seen a number of flags that signify
Packit Service 639957
encodings or codesets - C<utf8>, C<latin1> and C<ascii>. There seems to be
Packit Service 639957
some confusion on what these do, so here is a short comparison:
Packit Service 639957
Packit Service 639957
C<utf8> controls whether the JSON text created by C<encode> (and expected
Packit Service 639957
by C<decode>) is UTF-8 encoded or not, while C<latin1> and C<ascii> only
Packit Service 639957
control whether C<encode> escapes character values outside their respective
Packit Service 639957
codeset range. Neither of these flags conflict with each other, although
Packit Service 639957
some combinations make less sense than others.
Packit Service 639957
Packit Service 639957
Care has been taken to make all flags symmetrical with respect to
Packit Service 639957
C<encode> and C<decode>, that is, texts encoded with any combination of
Packit Service 639957
these flag values will be correctly decoded when the same flags are used
Packit Service 639957
- in general, if you use different flag settings while encoding vs. when
Packit Service 639957
decoding you likely have a bug somewhere.
Packit Service 639957
Packit Service 639957
Below comes a verbose discussion of these flags. Note that a "codeset" is
Packit Service 639957
simply an abstract set of character-codepoint pairs, while an encoding
Packit Service 639957
takes those codepoint numbers and I<encodes> them, in our case into
Packit Service 639957
octets. Unicode is (among other things) a codeset, UTF-8 is an encoding,
Packit Service 639957
and ISO-8859-1 (= latin 1) and ASCII are both codesets I<and> encodings at
Packit Service 639957
the same time, which can be confusing.
Packit Service 639957
Packit Service 639957
=over 4
Packit Service 639957
Packit Service 639957
=item C<utf8> flag disabled
Packit Service 639957
Packit Service 639957
When C<utf8> is disabled (the default), then C<encode>/C<decode> generate
Packit Service 639957
and expect Unicode strings, that is, characters with high ordinal Unicode
Packit Service 639957
values (> 255) will be encoded as such characters, and likewise such
Packit Service 639957
characters are decoded as-is, no changes to them will be done, except
Packit Service 639957
"(re-)interpreting" them as Unicode codepoints or Unicode characters,
Packit Service 639957
respectively (to Perl, these are the same thing in strings unless you do
Packit Service 639957
funny/weird/dumb stuff).
Packit Service 639957
Packit Service 639957
This is useful when you want to do the encoding yourself (e.g. when you
Packit Service 639957
want to have UTF-16 encoded JSON texts) or when some other layer does
Packit Service 639957
the encoding for you (for example, when printing to a terminal using a
Packit Service 639957
filehandle that transparently encodes to UTF-8 you certainly do NOT want
Packit Service 639957
to UTF-8 encode your data first and have Perl encode it another time).
Packit Service 639957
Packit Service 639957
=item C<utf8> flag enabled
Packit Service 639957
Packit Service 639957
If the C<utf8>-flag is enabled, C<encode>/C<decode> will encode all
Packit Service 639957
characters using the corresponding UTF-8 multi-byte sequence, and will
Packit Service 639957
expect your input strings to be encoded as UTF-8, that is, no "character"
Packit Service 639957
of the input string must have any value > 255, as UTF-8 does not allow
Packit Service 639957
that.
Packit Service 639957
Packit Service 639957
The C<utf8> flag therefore switches between two modes: disabled means you
Packit Service 639957
will get a Unicode string in Perl, enabled means you get an UTF-8 encoded
Packit Service 639957
octet/binary string in Perl.
Packit Service 639957
Packit Service 639957
=item C<latin1> or C<ascii> flags enabled
Packit Service 639957
Packit Service 639957
With C<latin1> (or C<ascii>) enabled, C<encode> will escape characters
Packit Service 639957
with ordinal values > 255 (> 127 with C<ascii>) and encode the remaining
Packit Service 639957
characters as specified by the C<utf8> flag.
Packit Service 639957
Packit Service 639957
If C<utf8> is disabled, then the result is also correctly encoded in those
Packit Service 639957
character sets (as both are proper subsets of Unicode, meaning that a
Packit Service 639957
Unicode string with all character values < 256 is the same thing as a
Packit Service 639957
ISO-8859-1 string, and a Unicode string with all character values < 128 is
Packit Service 639957
the same thing as an ASCII string in Perl).
Packit Service 639957
Packit Service 639957
If C<utf8> is enabled, you still get a correct UTF-8-encoded string,
Packit Service 639957
regardless of these flags, just some more characters will be escaped using
Packit Service 639957
C<\uXXXX> then before.
Packit Service 639957
Packit Service 639957
Note that ISO-8859-1-I<encoded> strings are not compatible with UTF-8
Packit Service 639957
encoding, while ASCII-encoded strings are. That is because the ISO-8859-1
Packit Service 639957
encoding is NOT a subset of UTF-8 (despite the ISO-8859-1 I<codeset> being
Packit Service 639957
a subset of Unicode), while ASCII is.
Packit Service 639957
Packit Service 639957
Surprisingly, C<decode> will ignore these flags and so treat all input
Packit Service 639957
values as governed by the C<utf8> flag. If it is disabled, this allows you
Packit Service 639957
to decode ISO-8859-1- and ASCII-encoded strings, as both strict subsets of
Packit Service 639957
Unicode. If it is enabled, you can correctly decode UTF-8 encoded strings.
Packit Service 639957
Packit Service 639957
So neither C<latin1> nor C<ascii> are incompatible with the C<utf8> flag -
Packit Service 639957
they only govern when the JSON output engine escapes a character or not.
Packit Service 639957
Packit Service 639957
The main use for C<latin1> is to relatively efficiently store binary data
Packit Service 639957
as JSON, at the expense of breaking compatibility with most JSON decoders.
Packit Service 639957
Packit Service 639957
The main use for C<ascii> is to force the output to not contain characters
Packit Service 639957
with values > 127, which means you can interpret the resulting string
Packit Service 639957
as UTF-8, ISO-8859-1, ASCII, KOI8-R or most about any character set and
Packit Service 639957
8-bit-encoding, and still get the same data structure back. This is useful
Packit Service 639957
when your channel for JSON transfer is not 8-bit clean or the encoding
Packit Service 639957
might be mangled in between (e.g. in mail), and works because ASCII is a
Packit Service 639957
proper subset of most 8-bit and multibyte encodings in use in the world.
Packit Service 639957
Packit Service 639957
=back
Packit Service 639957
Packit Service 639957
=head1 BACKWARD INCOMPATIBILITY
Packit Service 639957
Packit Service 639957
Since version 2.90, stringification (and string comparison) for
Packit Service 639957
C<JSON::true> and C<JSON::false> has not been overloaded. It shouldn't
Packit Service 639957
matter as long as you treat them as boolean values, but a code that
Packit Service 639957
expects they are stringified as "true" or "false" doesn't work as
Packit Service 639957
you have expected any more.
Packit Service 639957
Packit Service 639957
    if (JSON::true eq 'true') {  # now fails
Packit Service 639957
Packit Service 639957
    print "The result is $JSON::true now."; # => The result is 1 now.
Packit Service 639957
Packit Service 639957
And now these boolean values don't inherit JSON::Boolean, either.
Packit Service 639957
When you need to test a value is a JSON boolean value or not, use
Packit Service 639957
C<JSON::is_bool> function, instead of testing the value inherits
Packit Service 639957
a particular boolean class or not.
Packit Service 639957
Packit Service 639957
=head1 BUGS
Packit Service 639957
Packit Service 639957
Please report bugs on backend selection and additional features
Packit Service 639957
this module provides to RT or GitHub issues for this module:
Packit Service 639957
Packit Service 639957
=over 4
Packit Service 639957
Packit Service 639957
=item https://rt.cpan.org/Public/Dist/Display.html?Queue=JSON
Packit Service 639957
Packit Service 639957
=item https://github.com/makamaka/JSON/issues
Packit Service 639957
Packit Service 639957
=back
Packit Service 639957
Packit Service 639957
Please report bugs and feature requests on decoding/encoding
Packit Service 639957
and boolean behaviors to the author of the backend module you
Packit Service 639957
are using.
Packit Service 639957
Packit Service 639957
=head1 SEE ALSO
Packit Service 639957
Packit Service 639957
L<JSON::XS>, L<Cpanel::JSON::XS>, L<JSON::PP> for backends.
Packit Service 639957
Packit Service 639957
L<JSON::MaybeXS>, an alternative that prefers Cpanel::JSON::XS.
Packit Service 639957
Packit Service 639957
C<RFC4627>(L<http://www.ietf.org/rfc/rfc4627.txt>)
Packit Service 639957
Packit Service 639957
=head1 AUTHOR
Packit Service 639957
Packit Service 639957
Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
Packit Service 639957
Packit Service 639957
JSON::XS was written by  Marc Lehmann <schmorp[at]schmorp.de>
Packit Service 639957
Packit Service 639957
The release of this new version owes to the courtesy of Marc Lehmann.
Packit Service 639957
Packit Service 639957
Packit Service 639957
=head1 COPYRIGHT AND LICENSE
Packit Service 639957
Packit Service 639957
Copyright 2005-2013 by Makamaka Hannyaharamitu
Packit Service 639957
Packit Service 639957
This library is free software; you can redistribute it and/or modify
Packit Service 639957
it under the same terms as Perl itself. 
Packit Service 639957
Packit Service 639957
=cut
Packit Service 639957