The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


JSON::Meth - no nonsense JSON encoding/decoding as method calls on data


    use JSON::Meth;

    # encode JSON:
    my $json_string = { my => 'data', foo => [ 'bar' ] }->$j;

    # decode JSON
    my $perl_structure = '["look","ma!","no","vars"]'->$j;

    # encode and interpolate $j in a string to get the result
    { my => 'data' }->$j;
    say "Look ma, JSON: $j";

    # decode and grab a piece of data, as if $j were a hashref:
    my $data = '{"my":"data"}'->$j->{my}; # $data contains string "data" now

    # just pretend $j is an arrayref:
    say for @$j;

    # go nuts! (outputs JSON string '["bar",{"ber":"beer"}]')
    say '{"foo":["bar",{"ber":"beer"}]}'->$j->{foo}->$j;

    # even this works!! Meth? Not even once!
    say '["woo","hoo!"]'->$j->$j->$j->$j;


Don't make me think and give me what I want! This module automatically figures out whether you want to encode a Perl data structure to JSON or decode a JSON string to a Perl data structure.

The name JSON::Meth is formed from Method, which is the distinctive feature of this module.


$j variable

The module exports a single variable $j. To encode/decode JSON, simply make a method call on your data, with $j as the name of the method (see SYNOPSIS and THE MAGIC sections).

$json variable

    use JSON::Meth '$json';

An alias to $j that is exported upon request ($j won't be exported in this case, unless you ask for it too). Use this if you want to make your code more readable.


The result of the last decode/encode operation is stored internally by the module and you can access that data by using $j variable as if it contained that result. To get the results of encode operation, simply stringify $j (e.g. by interpolating it: "$j").


If you're not a fan of postfix decoding, just use $j as a prefix call:

    # encode JSON:
    my $json_string = $j->( { my => 'data', foo => [ 'bar' ] } );

    # decode JSON
    my $perl_structure = $j->( '["look","ma!","no","vars"]' );


The way this module deals with encoding objects is thusly:

  • if you're calling ->$j on an object, it needs to implement stringification overloading and what it stringifies to will be decoded.

  • if you have an object somewhere inside a data structure you're encoding: if it implements TO_JSON method, that method will be called, and the data returned used as json string to replace the object; if it doesn't implement such a method, it will be replaced with null


For more full-featured encoders, see JSON::MaybeXS, Mojo::JSON, or Mojo::JSON::MaybeXS.


Fork this module on GitHub:


To report bugs or request features, please use

If you can't access GitHub, you can email your request to bug-json-meth at




You can use and distribute this module under the same terms as Perl itself. See the LICENSE file included in this distribution for complete details.