NeatJSON
Pretty-print your JSON in Ruby with more power than is provided by JSON.pretty_generate. In particular, like Ruby's pp (pretty print), NeatJSON will keep objects on one line if they fit, but break them over multiple lines if needed.
Here's an excerpt (from a much larger JSON):
{
"navigation.createroute.poi":[
{"text":"Lay in a course to the Hilton","params":{"poi":"Hilton"}},
{"text":"Take me to the airport","params":{"poi":"airport"}},
{"text":"Let's go to IHOP","params":{"poi":"IHOP"}},
{"text":"Show me how to get to The Med","params":{"poi":"The Med"}},
{"text":"Create a route to Arby's","params":{"poi":"Arby's"}},
{
"text":"Go to the Hilton by the Airport",
"params":{"poi":"Hilton","location":"Airport"}
},
{
"text":"Take me to the Fry's in Fresno",
"params":{"poi":"Fry's","location":"Fresno"}
}
],
"navigation.eta":[
{"text":"When will we get there?"},
{"text":"When will I arrive?"},
{"text":"What time will I get to the destination?"},
{"text":"What time will I reach the destination?"},
{"text":"What time will it be when I arrive?"}
]
}
Installation
gem install neatjson
Examples
require 'neatjson'
o = { b:42.005, a:[42,17], longer:true, str:"yes
please" }
puts JSON.neat_generate(o)
#=> {"b":42.005,"a":[42,17],"longer":true,"str":"yes\nplease"}
puts JSON.neat_generate(o,sorted:true)
#=> {"a":[42,17],"b":42.005,"longer":true,"str":"yes\nplease"}
puts JSON.neat_generate(o,sorted:true,padding:1,after_comma:1)
#=> { "a":[ 42, 17 ], "b":42.005, "longer":true, "str":"yes\nplease" }
puts JSON.neat_generate(o,sorted:true,wrap:40)
#=> {
#=> "a":[42,17],
#=> "b":42.005,
#=> "longer":true,
#=> "str":"yes\nplease"
#=> }
puts JSON.neat_generate(o,sorted:true,wrap:40,decimals:1)
#=> {
#=> "a":[42.0,17.0],
#=> "b":42.0,
#=> "longer":true,
#=> "str":"yes\nplease"
#=> }
puts JSON.neat_generate(o,sorted:true,wrap:40,aligned:true)
#=> {
#=> "a" :[42,17],
#=> "b" :42.005,
#=> "longer":true,
#=> "str" :"yes\nplease"
#=> }
puts JSON.neat_generate(o,sorted:true,wrap:40,aligned:true,around_colon:1)
#=> {
#=> "a" : [42,17],
#=> "b" : 42.005,
#=> "longer" : true,
#=> "str" : "yes\nplease"
#=> }
puts JSON.neat_generate(o,sorted:true,wrap:40,aligned:true,around_colon:1,short:true)
#=> {"a" : [42,17],
#=> "b" : 42.005,
#=> "longer" : true,
#=> "str" : "yes\nplease"}
a = [1,2,[3,4,[5]]]
puts JSON.neat_generate(a)
#=> [1,2,[3,4,[5]]]
puts JSON.pretty_generate(a) # oof!
#=> [
#=> 1,
#=> 2,
#=> [
#=> 3,
#=> 4,
#=> [
#=> 5
#=> ]
#=> ]
#=> ]
puts JSON.neat_generate( a, wrap:true, short:true )
#=> [1,
#=> 2,
#=> [3,
#=> 4,
#=> [5]]]
Options
You may pass any of the following option symbols to neat_generate:
:wrap— The maximum line width before wrapping. Usefalseto never wrap, ortrue(or-1) to always wrap. Default:80:indent— Whitespace used to indent each level when wrapping. Default:" "(two spaces):short— Keep the output 'short' when wrapping? This puts opening brackets on the same line as the first value, and closing brackets on the same line as the last. Default:false- This causes the
:indentoption to be ignored, instead basing indentation on array and object padding.
- This causes the
:sorted— Sort the keys for objects to be in alphabetical order? Default:false:aligned— When wrapping objects, line up the colons (per object)? Default:false:decimals— Decimal precision to use for numbers; usefalseto keep numeric values precise. Default:false:array_padding— Number of spaces to put inside brackets for arrays. Default:0:object_padding— Number of spaces to put inside braces for objects. Default:0:padding— Shorthand to set both:array_paddingand:object_padding. Default:0:before_comma— Number of spaces to put before commas (for both arrays and objects). Default:0:after_comma— Number of spaces to put after commas (for both arrays and objects). Default:0:around_comma— Shorthand to set both:before_commaand:after_comma. Default:0:before_colon— Number of spaces to put before colons. Default:0:after_colon— Number of spaces to put after colons. Default:0:around_colon— Shorthand to set both:before_colonand:after_colon. Default:0
License & Contact
NeatJSON is copyright ©2015 by Gavin Kistner and is released under the MIT License. See the LICENSE.txt file for more details.
For bugs or feature requests please open issues on GitHub. For other communication you can email the author directly.
TODO (aka Known Limitations)
- Figure out the best way to play with custom objects that use
to_jsonfor their representation. - Option for
around_colonto only apply to multi-line objects. - Detect circular references.
- Possibly allow illegal JSON values like
NaNorInfinity. - Possibly allow "JSON5" output (legal identifiers unquoted, etc.)
HISTORY
v0.3.2 - April 16th, 2015
- Force YARD to use Markdown for documentation.
v0.3.1 - April 16th, 2015
- Remove some debugging code accidentally left in.
v0.3 - April 16th, 2015
- Fix another bug with
short:trueand wrapping array values inside objects.
- Fix another bug with
v0.2 - April 16th, 2015
- Fix bug with
short:trueand wrapping values inside objects.
- Fix bug with
v0.1 - April 15th, 2015
- Initial release.