Web::Request::Role::JSON - Make handling JSON easier in Web::Request


version 1.000


  # Create a request handler
  package My::App::Request;
  use Moose;
  extends 'Web::Request';
  with 'Web::Request::Role::JSON';

  # Make sure your app uses your request handler, e.g. using OX:
  package My::App::OX;
  sub request_class {'My::App::Request'}

  # Finally, in some controller action
  sub create_POST {
      my ($self, $req) = @_;

      my $data    = $req->decoded_json_content;
      my $created = $self->model->create($data);
      return $self->new_json_response($created, undef, 201);


Web::Request::Role::JSON provides a few methods that make handling JSON in Web::Request a bit easier.

Please note that all methods return a Web::Response object. Depending on the framework you use (or lack thereof), you might have to call finalize on the response object to turn it into a valid PSGI response.



  my $perl_hash = $req->decoded_json_content;

Extracts and decodes a JSON payload from the request.


  $req->new_json_response( $data );
  $req->new_json_response( $data, $header_ref );
  $req->new_json_response( $data, $header_ref, $http_status );

Convert your data to JSON and generate a new response with correct HTTP headers.

You can pass in more headers as the second argument (either hashref or arrayref). These headers will be passed straight on to HTTP::Headers->new().

You can also pass a HTTP status code as the third parameter. If none is provided, we default to 200.


  $req->new_json_response( 'something is wrong' );
  $req->new_json_response( $error_data );
  $req->new_json_response( $error, $status );

Generate a JSON object out of your error message, if the message is a plain string. But you can also pass in a data structure that will be converte to JSON.

Per default, HTTP status is set to 400, but you can pass any other status as a second argument. (Yes, there is no checking if you pass a valid status code or not. You're old enough to not do stupid things..)


Thanks to


Thomas Klausner <>


This software is copyright (c) 2017 by Thomas Klausner.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.