Working with json in Erlang has vastly improved since the last time I looked at it, particularly with the addition of maps to the language (in R17).
-module(foo_handler).
-export([init/3]).
-export([allowed_methods/2, content_types_accepted/2]).
-export([foo/2]).
init(_Transport, _Req, []) ->
{upgrade, protocol, cowboy_rest}.
allowed_methods(Req, State) ->
{[<<"POST">>], Req, State}.
content_types_accepted(Req, State) ->
{[
{<<"application/json">>, foo}
], Req, State}.
foo(Req, State) ->
{ok, Body, Req1} = cowboy_req:body(Req),
Json = jiffy:decode(Body, [return_maps]),
Bar = maps:get(<<"bar">>, Json),
{ok, Res} = do_something(Bar),
Body = jiffy:encode(#{result => Res}),
{true, cowboy_req:set_resp_body(Body, Req1), State}.