requires ruby-json (either bundled or separate, both are fine)