neatjson 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +297 -293
- data/lib/neatjson.rb +0 -1
- data/neatjson.gemspec +17 -17
- data/test/large.json +401 -401
- data/test/test_neatjson.rb +1 -1
- data/test/tests.js +183 -181
- data/test/tests.rb +179 -177
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd71a0bca8dacc2bbb100e03944cce9dd2e9af90
|
4
|
+
data.tar.gz: 02f77183e8e587d981c06c5c2c6fa2a999a08309
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60b221078927b2628277e20215dafd4def6ab411c3204cb767da4e8b78e9b882bb9f9a0eb34d1464526e577db46bbd4239678821f370f69ccc7b33a2c01ddb4d
|
7
|
+
data.tar.gz: 726176200c5fef15c51f42cda4fa880fc2e77655822628797ebdc7e5e64d1e0a29abbe04a000682c5277bb47c5efdc5d4479336247cacf9702d907c11da38f9a
|
data/README.md
CHANGED
@@ -1,293 +1,297 @@
|
|
1
|
-
# NeatJSON
|
2
|
-
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/neatjson.svg)](http://badge.fury.io/rb/neatjson)
|
4
|
-
[![Gem Downloads](http://ruby-gem-downloads-badge.herokuapp.com/neatjson?type=total&color=brightgreen)](https://rubygems.org/gems/neatjson)
|
5
|
-
|
6
|
-
Pretty-print your JSON in Ruby or JavaScript with more power than is provided by `JSON.pretty_generate` (Ruby) or `JSON.stringify` (JS). For example, like Ruby's `pp` (pretty print), NeatJSON can keep objects on one line if they fit, but break them over multiple lines if needed.
|
7
|
-
|
8
|
-
**Features (all optional):**
|
9
|
-
|
10
|
-
* Keep values on one line, with variable wrap width.
|
11
|
-
* Format numeric values to specified precision.
|
12
|
-
* Sort object keys to be in alphabetical order.
|
13
|
-
* Arbitrary whitespace (or really, any string) for indentation.
|
14
|
-
* "Short" wrapping uses fewer lines, indentation based on values. (See last example below.)
|
15
|
-
* Indent final closing bracket/brace for each array/object.
|
16
|
-
* Adjust number of spaces inside array/object braces.
|
17
|
-
* Adjust number of spaces before/after commas and colons (adjustable for single-line vs. multi-line )
|
18
|
-
* Line up the values for an object across lines.
|
19
|
-
* [Online webpage](http://phrogz.net/JS/NeatJSON) for conversions and experimenting with options.
|
20
|
-
|
21
|
-
Here's a short example of output showing the power of proper wrapping:
|
22
|
-
|
23
|
-
~~~ json
|
24
|
-
{
|
25
|
-
"navigation.createroute.poi":[
|
26
|
-
{"text":"Lay in a course to the Hilton","params":{"poi":"Hilton"}},
|
27
|
-
{"text":"Take me to the airport","params":{"poi":"airport"}},
|
28
|
-
{"text":"Let's go to IHOP","params":{"poi":"IHOP"}},
|
29
|
-
{"text":"Show me how to get to The Med","params":{"poi":"The Med"}},
|
30
|
-
{"text":"Create a route to Arby's","params":{"poi":"Arby's"}},
|
31
|
-
{
|
32
|
-
"text":"Go to the Hilton by the Airport",
|
33
|
-
"params":{"poi":"Hilton","location":"Airport"}
|
34
|
-
},
|
35
|
-
{
|
36
|
-
"text":"Take me to the Fry's in Fresno",
|
37
|
-
"params":{"poi":"Fry's","location":"Fresno"}
|
38
|
-
}
|
39
|
-
],
|
40
|
-
"navigation.eta":[
|
41
|
-
{"text":"When will we get there?"},
|
42
|
-
{"text":"When will I arrive?"},
|
43
|
-
{"text":"What time will I get to the destination?"},
|
44
|
-
{"text":"What time will I reach the destination?"},
|
45
|
-
{"text":"What time will it be when I arrive?"}
|
46
|
-
]
|
47
|
-
}
|
48
|
-
~~~
|
49
|
-
|
50
|
-
## Installation
|
51
|
-
|
52
|
-
* Ruby: `gem install neatjson`
|
53
|
-
* JavaScript: Clone the GitHub repo and copy `javascript/neatjson.js`
|
54
|
-
* _Sorry, no NodeJS package yet._
|
55
|
-
|
56
|
-
## Examples
|
57
|
-
|
58
|
-
~~~ ruby
|
59
|
-
require 'neatjson'
|
60
|
-
|
61
|
-
o = { b:42.005, a:[42,17], longer:true, str:"yes
|
62
|
-
please" }
|
63
|
-
|
64
|
-
puts JSON.neat_generate(o)
|
65
|
-
#=> {"b":42.005,"a":[42,17],"longer":true,"str":"yes\nplease"}
|
66
|
-
|
67
|
-
puts JSON.neat_generate(o,sort:true)
|
68
|
-
#=> {"a":[42,17],"b":42.005,"longer":true,"str":"yes\nplease"}
|
69
|
-
|
70
|
-
puts JSON.neat_generate(o,sort:true,padding:1,after_comma:1)
|
71
|
-
#=> { "a":[ 42, 17 ], "b":42.005, "longer":true, "str":"yes\nplease" }
|
72
|
-
|
73
|
-
puts JSON.neat_generate(o,sort:true,wrap:40)
|
74
|
-
#=> {
|
75
|
-
#=> "a":[42,17],
|
76
|
-
#=> "b":42.005,
|
77
|
-
#=> "longer":true,
|
78
|
-
#=> "str":"yes\nplease"
|
79
|
-
#=> }
|
80
|
-
|
81
|
-
puts JSON.neat_generate(o,sort:true,wrap:40,decimals:2)
|
82
|
-
#=> {
|
83
|
-
#=> "a":[42,17],
|
84
|
-
#=> "b":42.01,
|
85
|
-
#=> "longer":true,
|
86
|
-
#=> "str":"yes\nplease"
|
87
|
-
#=> }
|
88
|
-
|
89
|
-
puts JSON.neat_generate(o,sort:->(k){ k.length },wrap:40,aligned:true)
|
90
|
-
#=> {
|
91
|
-
#=> "a" :[42,17],
|
92
|
-
#=> "b" :42.005,
|
93
|
-
#=> "str" :"yes\nplease",
|
94
|
-
#=> "longer":true
|
95
|
-
#=> }
|
96
|
-
|
97
|
-
puts JSON.neat_generate(o,sort:true,wrap:40,aligned:true,around_colon:1)
|
98
|
-
#=> {
|
99
|
-
#=> "a" : [42,17],
|
100
|
-
#=> "b" : 42.005,
|
101
|
-
#=> "longer" : true,
|
102
|
-
#=> "str" : "yes\nplease"
|
103
|
-
#=> }
|
104
|
-
|
105
|
-
puts JSON.neat_generate(o,sort:true,wrap:40,aligned:true,around_colon:1,short:true)
|
106
|
-
#=> {"a" : [42,17],
|
107
|
-
#=> "b" : 42.005,
|
108
|
-
#=> "longer" : true,
|
109
|
-
#=> "str" : "yes\nplease"}
|
110
|
-
|
111
|
-
a = [1,2,[3,4,[5]]]
|
112
|
-
puts JSON.neat_generate(a)
|
113
|
-
#=> [1,2,[3,4,[5]]]
|
114
|
-
|
115
|
-
puts JSON.pretty_generate(a) # oof!
|
116
|
-
#=> [
|
117
|
-
#=> 1,
|
118
|
-
#=> 2,
|
119
|
-
#=> [
|
120
|
-
#=> 3,
|
121
|
-
#=> 4,
|
122
|
-
#=> [
|
123
|
-
#=> 5
|
124
|
-
#=> ]
|
125
|
-
#=> ]
|
126
|
-
#=> ]
|
127
|
-
|
128
|
-
puts JSON.neat_generate( a, wrap:true, short:true )
|
129
|
-
#=> [1,
|
130
|
-
#=> 2,
|
131
|
-
#=> [3,
|
132
|
-
#=> 4,
|
133
|
-
#=> [5]]]
|
134
|
-
|
135
|
-
data = ["foo","bar",{dogs:42,piggies:{color:'pink', tasty:true},
|
136
|
-
barn:{jimmy:[1,2,3,4,5],jammy:3.141592653,hot:"pajammy"},cats:7}]
|
137
|
-
|
138
|
-
opts = { short:true, wrap:60, decimals:3, sort:true, aligned:true,
|
139
|
-
padding:1, after_comma:1, around_colon_n:1 }
|
140
|
-
|
141
|
-
puts JSON.neat_generate( data, opts )
|
142
|
-
#=> [ "foo",
|
143
|
-
#=> "bar",
|
144
|
-
#=> { "barn" : { "hot" : "pajammy",
|
145
|
-
#=> "jammy" : 3.142,
|
146
|
-
#=> "jimmy" : [ 1, 2, 3, 4, 5 ] },
|
147
|
-
#=> "cats" : 7,
|
148
|
-
#=> "dogs" : 42,
|
149
|
-
#=> "piggies" : { "color":"pink", "tasty":true } } ]
|
150
|
-
~~~
|
151
|
-
|
152
|
-
## Options
|
153
|
-
You may pass any of the following option symbols to `neat_generate`:
|
154
|
-
|
155
|
-
* `:wrap` — The maximum line width before wrapping. Use `false` to never wrap, or `true` (or `-1`) to always wrap. Default: `80`
|
156
|
-
* `:indent` — Whitespace used to indent each level when wrapping. Default: `" "` (two spaces)
|
157
|
-
* `:indent_last` — Indent the closing bracket/brace for arrays and objects? Default: `false`
|
158
|
-
* `: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`
|
159
|
-
* _This causes the `:indent` and `:indent_last` options to be ignored, instead basing indentation on array and object padding._
|
160
|
-
* `:sort` — Sort objects' keys in alphabetical order (`true`), or supply a lambda for custom sorting. Default: `false`
|
161
|
-
* If you supply a lambda to the `sort` option, it will be passed three values: the (string) name of the key, the associated value, and the object being sorted, e.g. `{ sort:->(key,value,hash){ Float(value) rescue Float::MAX } }`
|
162
|
-
* `:aligned` — When wrapping objects, line up the colons (per object)? Default: `false`
|
163
|
-
* `:decimals` — Decimal precision to use for non-integer numbers; use `false` to keep float values precise. Default: `false`
|
164
|
-
* `:array_padding` — Number of spaces to put inside brackets for arrays. Default: `0`
|
165
|
-
* `:object_padding` — Number of spaces to put inside braces for objects. Default: `0`
|
166
|
-
* `:padding` — Shorthand to set both `:array_padding` and `:object_padding`. Default: `0`
|
167
|
-
* `:before_comma` — Number of spaces to put before commas (for both arrays and objects). Default: `0`
|
168
|
-
* `:after_comma` — Number of spaces to put after commas (for both arrays and objects). Default: `0`
|
169
|
-
* `:around_comma` — Shorthand to set both `:before_comma` and `:after_comma`. Default: `0`
|
170
|
-
* `:before_colon_1` — Number of spaces before a colon when the object is on one line. Default: `0`
|
171
|
-
* `:after_colon_1` — Number of spaces after a colon when the object is on one line. Default: `0`
|
172
|
-
* `:before_colon_n` — Number of spaces before a colon when the object is on multiple lines. Default: `0`
|
173
|
-
* `:after_colon_n` — Number of spaces after a colon when the object is on multiple lines. Default: `0`
|
174
|
-
* `:before_colon` — Shorthand to set both `:before_colon_1` and `:before_colon_n`. Default: `0`
|
175
|
-
* `:after_colon` — Shorthand to set both `:after_colon_1` and `:after_colon_n`. Default: `0`
|
176
|
-
* `:around_colon` — Shorthand to set both `:before_colon` and `:after_colon`. Default: `0`
|
177
|
-
|
178
|
-
You may omit the 'value' and/or 'object' parameters in your `sort` lambda if desired. For example:
|
179
|
-
|
180
|
-
~~~ ruby
|
181
|
-
# Ruby sorting examples
|
182
|
-
obj = {e:3, a:2, c:3, b:2, d:1, f:3}
|
183
|
-
|
184
|
-
JSON.neat_generate obj, sort:true # sort by key name
|
185
|
-
#=> {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
186
|
-
|
187
|
-
JSON.neat_generate obj, sort:->(k){ k } # sort by key name (long way)
|
188
|
-
#=> {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
189
|
-
|
190
|
-
JSON.neat_generate obj, sort:->(k,v){ [-v,k] } # sort by descending value, then by ascending key
|
191
|
-
#=> {"c":3,"e":3,"f":3,"a":2,"b":2,"d":1}
|
192
|
-
|
193
|
-
JSON.neat_generate obj, sort:->(k,v,h){ h.values.count(v) } # sort by count of keys with same value
|
194
|
-
#=> {"d":1,"a":2,"b":2,"e":3,"c":3,"f":3}
|
195
|
-
~~~
|
196
|
-
|
197
|
-
~~~ js
|
198
|
-
// JavaScript sorting examples
|
199
|
-
var obj = {e:3, a:2, c:3, b:2, d:1, f:3};
|
200
|
-
|
201
|
-
neatJSON( obj, {sort:true} ); // sort by key name
|
202
|
-
// {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
203
|
-
|
204
|
-
neatJSON( obj, { sort:function(k){ return k }} ); // sort by key name (long way)
|
205
|
-
// {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
206
|
-
|
207
|
-
neatJSON( obj, { sort:function(k,v){ return -v }} ); // sort by descending value
|
208
|
-
// {"e":3,"c":3,"f":3,"a":2,"b":2,"d":1}
|
209
|
-
|
210
|
-
var countByValue = {};
|
211
|
-
for (var k in obj) countByValue[obj[k]] = (countByValue[obj[k]]||0) + 1;
|
212
|
-
neatJSON( obj, { sort:function(k,v,h){ return countByValue[v] } } ); // sort by count of same value
|
213
|
-
// {"d":1,"a":2,"b":2,"e":3,"c":3,"f":3}
|
214
|
-
~~~
|
215
|
-
|
216
|
-
_Note that the JavaScript version of NeatJSON does not provide a mechanism for cascading sort in the same manner as Ruby._
|
217
|
-
|
218
|
-
|
219
|
-
## License & Contact
|
220
|
-
|
221
|
-
NeatJSON is copyright ©2015–2016 by Gavin Kistner and is released under
|
222
|
-
the [MIT License](http://www.opensource.org/licenses/mit-license.php).
|
223
|
-
See the LICENSE.txt file for more details.
|
224
|
-
|
225
|
-
For bugs or feature requests please open [issues on GitHub][1].
|
226
|
-
For other communication you can [email the author directly](mailto:!@phrogz.net?subject=NeatJSON).
|
227
|
-
|
228
|
-
## TODO (aka Known Limitations)
|
229
|
-
|
230
|
-
* Figure out the best way to play with custom objects that use `to_json` for their representation.
|
231
|
-
* Detect circular references.
|
232
|
-
* Possibly allow illegal JSON values like `NaN` or `Infinity`.
|
233
|
-
* Possibly allow "JSON5" output (legal identifiers unquoted, etc.)
|
234
|
-
|
235
|
-
## HISTORY
|
236
|
-
|
237
|
-
* **v0.8.
|
238
|
-
* Fix issue #
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
*
|
244
|
-
*
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
*
|
252
|
-
|
253
|
-
* **v0.7.
|
254
|
-
* Fix
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
* **v0.6.
|
264
|
-
*
|
265
|
-
|
266
|
-
|
267
|
-
* **v0.6** -
|
268
|
-
*
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
*
|
273
|
-
|
274
|
-
|
275
|
-
*
|
276
|
-
*
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
1
|
+
# NeatJSON
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/neatjson.svg)](http://badge.fury.io/rb/neatjson)
|
4
|
+
[![Gem Downloads](http://ruby-gem-downloads-badge.herokuapp.com/neatjson?type=total&color=brightgreen)](https://rubygems.org/gems/neatjson)
|
5
|
+
|
6
|
+
Pretty-print your JSON in Ruby or JavaScript with more power than is provided by `JSON.pretty_generate` (Ruby) or `JSON.stringify` (JS). For example, like Ruby's `pp` (pretty print), NeatJSON can keep objects on one line if they fit, but break them over multiple lines if needed.
|
7
|
+
|
8
|
+
**Features (all optional):**
|
9
|
+
|
10
|
+
* Keep values on one line, with variable wrap width.
|
11
|
+
* Format numeric values to specified precision.
|
12
|
+
* Sort object keys to be in alphabetical order.
|
13
|
+
* Arbitrary whitespace (or really, any string) for indentation.
|
14
|
+
* "Short" wrapping uses fewer lines, indentation based on values. (See last example below.)
|
15
|
+
* Indent final closing bracket/brace for each array/object.
|
16
|
+
* Adjust number of spaces inside array/object braces.
|
17
|
+
* Adjust number of spaces before/after commas and colons (adjustable for single-line vs. multi-line )
|
18
|
+
* Line up the values for an object across lines.
|
19
|
+
* [Online webpage](http://phrogz.net/JS/NeatJSON) for conversions and experimenting with options.
|
20
|
+
|
21
|
+
Here's a short example of output showing the power of proper wrapping:
|
22
|
+
|
23
|
+
~~~ json
|
24
|
+
{
|
25
|
+
"navigation.createroute.poi":[
|
26
|
+
{"text":"Lay in a course to the Hilton","params":{"poi":"Hilton"}},
|
27
|
+
{"text":"Take me to the airport","params":{"poi":"airport"}},
|
28
|
+
{"text":"Let's go to IHOP","params":{"poi":"IHOP"}},
|
29
|
+
{"text":"Show me how to get to The Med","params":{"poi":"The Med"}},
|
30
|
+
{"text":"Create a route to Arby's","params":{"poi":"Arby's"}},
|
31
|
+
{
|
32
|
+
"text":"Go to the Hilton by the Airport",
|
33
|
+
"params":{"poi":"Hilton","location":"Airport"}
|
34
|
+
},
|
35
|
+
{
|
36
|
+
"text":"Take me to the Fry's in Fresno",
|
37
|
+
"params":{"poi":"Fry's","location":"Fresno"}
|
38
|
+
}
|
39
|
+
],
|
40
|
+
"navigation.eta":[
|
41
|
+
{"text":"When will we get there?"},
|
42
|
+
{"text":"When will I arrive?"},
|
43
|
+
{"text":"What time will I get to the destination?"},
|
44
|
+
{"text":"What time will I reach the destination?"},
|
45
|
+
{"text":"What time will it be when I arrive?"}
|
46
|
+
]
|
47
|
+
}
|
48
|
+
~~~
|
49
|
+
|
50
|
+
## Installation
|
51
|
+
|
52
|
+
* Ruby: `gem install neatjson`
|
53
|
+
* JavaScript: Clone the GitHub repo and copy `javascript/neatjson.js`
|
54
|
+
* _Sorry, no NodeJS package yet._
|
55
|
+
|
56
|
+
## Examples
|
57
|
+
|
58
|
+
~~~ ruby
|
59
|
+
require 'neatjson'
|
60
|
+
|
61
|
+
o = { b:42.005, a:[42,17], longer:true, str:"yes
|
62
|
+
please" }
|
63
|
+
|
64
|
+
puts JSON.neat_generate(o)
|
65
|
+
#=> {"b":42.005,"a":[42,17],"longer":true,"str":"yes\nplease"}
|
66
|
+
|
67
|
+
puts JSON.neat_generate(o,sort:true)
|
68
|
+
#=> {"a":[42,17],"b":42.005,"longer":true,"str":"yes\nplease"}
|
69
|
+
|
70
|
+
puts JSON.neat_generate(o,sort:true,padding:1,after_comma:1)
|
71
|
+
#=> { "a":[ 42, 17 ], "b":42.005, "longer":true, "str":"yes\nplease" }
|
72
|
+
|
73
|
+
puts JSON.neat_generate(o,sort:true,wrap:40)
|
74
|
+
#=> {
|
75
|
+
#=> "a":[42,17],
|
76
|
+
#=> "b":42.005,
|
77
|
+
#=> "longer":true,
|
78
|
+
#=> "str":"yes\nplease"
|
79
|
+
#=> }
|
80
|
+
|
81
|
+
puts JSON.neat_generate(o,sort:true,wrap:40,decimals:2)
|
82
|
+
#=> {
|
83
|
+
#=> "a":[42,17],
|
84
|
+
#=> "b":42.01,
|
85
|
+
#=> "longer":true,
|
86
|
+
#=> "str":"yes\nplease"
|
87
|
+
#=> }
|
88
|
+
|
89
|
+
puts JSON.neat_generate(o,sort:->(k){ k.length },wrap:40,aligned:true)
|
90
|
+
#=> {
|
91
|
+
#=> "a" :[42,17],
|
92
|
+
#=> "b" :42.005,
|
93
|
+
#=> "str" :"yes\nplease",
|
94
|
+
#=> "longer":true
|
95
|
+
#=> }
|
96
|
+
|
97
|
+
puts JSON.neat_generate(o,sort:true,wrap:40,aligned:true,around_colon:1)
|
98
|
+
#=> {
|
99
|
+
#=> "a" : [42,17],
|
100
|
+
#=> "b" : 42.005,
|
101
|
+
#=> "longer" : true,
|
102
|
+
#=> "str" : "yes\nplease"
|
103
|
+
#=> }
|
104
|
+
|
105
|
+
puts JSON.neat_generate(o,sort:true,wrap:40,aligned:true,around_colon:1,short:true)
|
106
|
+
#=> {"a" : [42,17],
|
107
|
+
#=> "b" : 42.005,
|
108
|
+
#=> "longer" : true,
|
109
|
+
#=> "str" : "yes\nplease"}
|
110
|
+
|
111
|
+
a = [1,2,[3,4,[5]]]
|
112
|
+
puts JSON.neat_generate(a)
|
113
|
+
#=> [1,2,[3,4,[5]]]
|
114
|
+
|
115
|
+
puts JSON.pretty_generate(a) # oof!
|
116
|
+
#=> [
|
117
|
+
#=> 1,
|
118
|
+
#=> 2,
|
119
|
+
#=> [
|
120
|
+
#=> 3,
|
121
|
+
#=> 4,
|
122
|
+
#=> [
|
123
|
+
#=> 5
|
124
|
+
#=> ]
|
125
|
+
#=> ]
|
126
|
+
#=> ]
|
127
|
+
|
128
|
+
puts JSON.neat_generate( a, wrap:true, short:true )
|
129
|
+
#=> [1,
|
130
|
+
#=> 2,
|
131
|
+
#=> [3,
|
132
|
+
#=> 4,
|
133
|
+
#=> [5]]]
|
134
|
+
|
135
|
+
data = ["foo","bar",{dogs:42,piggies:{color:'pink', tasty:true},
|
136
|
+
barn:{jimmy:[1,2,3,4,5],jammy:3.141592653,hot:"pajammy"},cats:7}]
|
137
|
+
|
138
|
+
opts = { short:true, wrap:60, decimals:3, sort:true, aligned:true,
|
139
|
+
padding:1, after_comma:1, around_colon_n:1 }
|
140
|
+
|
141
|
+
puts JSON.neat_generate( data, opts )
|
142
|
+
#=> [ "foo",
|
143
|
+
#=> "bar",
|
144
|
+
#=> { "barn" : { "hot" : "pajammy",
|
145
|
+
#=> "jammy" : 3.142,
|
146
|
+
#=> "jimmy" : [ 1, 2, 3, 4, 5 ] },
|
147
|
+
#=> "cats" : 7,
|
148
|
+
#=> "dogs" : 42,
|
149
|
+
#=> "piggies" : { "color":"pink", "tasty":true } } ]
|
150
|
+
~~~
|
151
|
+
|
152
|
+
## Options
|
153
|
+
You may pass any of the following option symbols to `neat_generate`:
|
154
|
+
|
155
|
+
* `:wrap` — The maximum line width before wrapping. Use `false` to never wrap, or `true` (or `-1`) to always wrap. Default: `80`
|
156
|
+
* `:indent` — Whitespace used to indent each level when wrapping. Default: `" "` (two spaces)
|
157
|
+
* `:indent_last` — Indent the closing bracket/brace for arrays and objects? Default: `false`
|
158
|
+
* `: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`
|
159
|
+
* _This causes the `:indent` and `:indent_last` options to be ignored, instead basing indentation on array and object padding._
|
160
|
+
* `:sort` — Sort objects' keys in alphabetical order (`true`), or supply a lambda for custom sorting. Default: `false`
|
161
|
+
* If you supply a lambda to the `sort` option, it will be passed three values: the (string) name of the key, the associated value, and the object being sorted, e.g. `{ sort:->(key,value,hash){ Float(value) rescue Float::MAX } }`
|
162
|
+
* `:aligned` — When wrapping objects, line up the colons (per object)? Default: `false`
|
163
|
+
* `:decimals` — Decimal precision to use for non-integer numbers; use `false` to keep float values precise. Default: `false`
|
164
|
+
* `:array_padding` — Number of spaces to put inside brackets for arrays. Default: `0`
|
165
|
+
* `:object_padding` — Number of spaces to put inside braces for objects. Default: `0`
|
166
|
+
* `:padding` — Shorthand to set both `:array_padding` and `:object_padding`. Default: `0`
|
167
|
+
* `:before_comma` — Number of spaces to put before commas (for both arrays and objects). Default: `0`
|
168
|
+
* `:after_comma` — Number of spaces to put after commas (for both arrays and objects). Default: `0`
|
169
|
+
* `:around_comma` — Shorthand to set both `:before_comma` and `:after_comma`. Default: `0`
|
170
|
+
* `:before_colon_1` — Number of spaces before a colon when the object is on one line. Default: `0`
|
171
|
+
* `:after_colon_1` — Number of spaces after a colon when the object is on one line. Default: `0`
|
172
|
+
* `:before_colon_n` — Number of spaces before a colon when the object is on multiple lines. Default: `0`
|
173
|
+
* `:after_colon_n` — Number of spaces after a colon when the object is on multiple lines. Default: `0`
|
174
|
+
* `:before_colon` — Shorthand to set both `:before_colon_1` and `:before_colon_n`. Default: `0`
|
175
|
+
* `:after_colon` — Shorthand to set both `:after_colon_1` and `:after_colon_n`. Default: `0`
|
176
|
+
* `:around_colon` — Shorthand to set both `:before_colon` and `:after_colon`. Default: `0`
|
177
|
+
|
178
|
+
You may omit the 'value' and/or 'object' parameters in your `sort` lambda if desired. For example:
|
179
|
+
|
180
|
+
~~~ ruby
|
181
|
+
# Ruby sorting examples
|
182
|
+
obj = {e:3, a:2, c:3, b:2, d:1, f:3}
|
183
|
+
|
184
|
+
JSON.neat_generate obj, sort:true # sort by key name
|
185
|
+
#=> {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
186
|
+
|
187
|
+
JSON.neat_generate obj, sort:->(k){ k } # sort by key name (long way)
|
188
|
+
#=> {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
189
|
+
|
190
|
+
JSON.neat_generate obj, sort:->(k,v){ [-v,k] } # sort by descending value, then by ascending key
|
191
|
+
#=> {"c":3,"e":3,"f":3,"a":2,"b":2,"d":1}
|
192
|
+
|
193
|
+
JSON.neat_generate obj, sort:->(k,v,h){ h.values.count(v) } # sort by count of keys with same value
|
194
|
+
#=> {"d":1,"a":2,"b":2,"e":3,"c":3,"f":3}
|
195
|
+
~~~
|
196
|
+
|
197
|
+
~~~ js
|
198
|
+
// JavaScript sorting examples
|
199
|
+
var obj = {e:3, a:2, c:3, b:2, d:1, f:3};
|
200
|
+
|
201
|
+
neatJSON( obj, {sort:true} ); // sort by key name
|
202
|
+
// {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
203
|
+
|
204
|
+
neatJSON( obj, { sort:function(k){ return k }} ); // sort by key name (long way)
|
205
|
+
// {"a":2,"b":2,"c":3,"d":1,"e":3,"f":3}
|
206
|
+
|
207
|
+
neatJSON( obj, { sort:function(k,v){ return -v }} ); // sort by descending value
|
208
|
+
// {"e":3,"c":3,"f":3,"a":2,"b":2,"d":1}
|
209
|
+
|
210
|
+
var countByValue = {};
|
211
|
+
for (var k in obj) countByValue[obj[k]] = (countByValue[obj[k]]||0) + 1;
|
212
|
+
neatJSON( obj, { sort:function(k,v,h){ return countByValue[v] } } ); // sort by count of same value
|
213
|
+
// {"d":1,"a":2,"b":2,"e":3,"c":3,"f":3}
|
214
|
+
~~~
|
215
|
+
|
216
|
+
_Note that the JavaScript version of NeatJSON does not provide a mechanism for cascading sort in the same manner as Ruby._
|
217
|
+
|
218
|
+
|
219
|
+
## License & Contact
|
220
|
+
|
221
|
+
NeatJSON is copyright ©2015–2016 by Gavin Kistner and is released under
|
222
|
+
the [MIT License](http://www.opensource.org/licenses/mit-license.php).
|
223
|
+
See the LICENSE.txt file for more details.
|
224
|
+
|
225
|
+
For bugs or feature requests please open [issues on GitHub][1].
|
226
|
+
For other communication you can [email the author directly](mailto:!@phrogz.net?subject=NeatJSON).
|
227
|
+
|
228
|
+
## TODO (aka Known Limitations)
|
229
|
+
|
230
|
+
* Figure out the best way to play with custom objects that use `to_json` for their representation.
|
231
|
+
* Detect circular references.
|
232
|
+
* Possibly allow illegal JSON values like `NaN` or `Infinity`.
|
233
|
+
* Possibly allow "JSON5" output (legal identifiers unquoted, etc.)
|
234
|
+
|
235
|
+
## HISTORY
|
236
|
+
|
237
|
+
* **v0.8.3** — February 20, 2017
|
238
|
+
* Fix issue #25: Sorting keys on multi-line object **using function** does not work without "short" [JS only]
|
239
|
+
* _Thanks Bernhard Weichel_
|
240
|
+
|
241
|
+
* **v0.8.2** - December 16th, 2016
|
242
|
+
* Fix issue #22: Sorting keys on multi-line object does not work without "short" [JS only]
|
243
|
+
* Update online interface to support tabs as well as spaces.
|
244
|
+
* Update online interface to use a textarea for the output (easier to select and copy).
|
245
|
+
* Update online interface turn off spell checking for input and output.
|
246
|
+
|
247
|
+
* **v0.8.1** - April 22nd, 2016
|
248
|
+
* Make NeatJSON work with [Opal](http://opalrb.org) (by removing all in-place string mutations)
|
249
|
+
|
250
|
+
* **v0.8** - April 21st, 2016
|
251
|
+
* Allow `sort` to take a lambda for customized sorting of object key/values.
|
252
|
+
|
253
|
+
* **v0.7.2** - April 14th, 2016
|
254
|
+
* Fix JavaScript library to support objects without an `Object` constructor (e.g. `location`).
|
255
|
+
* Online HTML converter accepts arbitrary JavaScript values as input in addition to JSON.
|
256
|
+
|
257
|
+
* **v0.7.1** - April 6th, 2016
|
258
|
+
* Fix Ruby library to work around bug in Opal.
|
259
|
+
|
260
|
+
* **v0.7** - March 26th, 2016
|
261
|
+
* Add `indentLast`/`indent_last` feature.
|
262
|
+
|
263
|
+
* **v0.6.2** - February 8th, 2016
|
264
|
+
* Use memoization to avoid performance stalls when wrapping deeply-nested objects/arrays.
|
265
|
+
_Thanks @chroche_
|
266
|
+
|
267
|
+
* **v0.6.1** - October 12th, 2015
|
268
|
+
* Fix handling of nested empty objects and arrays. (Would cause a runtime error in many cases.)
|
269
|
+
* _This change causes empty arrays in a tight wrapping scenario to appear on a single line where they would previously take up three lines._
|
270
|
+
|
271
|
+
* **v0.6** - April 26th, 2015
|
272
|
+
* Added `before_colon_1` and `before_colon_n` to distinguish between single-line and multi-line objects.
|
273
|
+
|
274
|
+
* **v0.5** - April 19th, 2015
|
275
|
+
* Do not format integers (or floats that equal their integer) using `decimals` option.
|
276
|
+
* Make `neatJSON()` JavaScript available to Node.js as well as web browsers.
|
277
|
+
* Add (Node-based) testing for the JavaScript version.
|
278
|
+
|
279
|
+
* **v0.4** - April 18th, 2015
|
280
|
+
* Add JavaScript version with online runner.
|
281
|
+
|
282
|
+
* **v0.3.2** - April 16th, 2015
|
283
|
+
* Force YARD to use Markdown for documentation.
|
284
|
+
|
285
|
+
* **v0.3.1** - April 16th, 2015
|
286
|
+
* Remove some debugging code accidentally left in.
|
287
|
+
|
288
|
+
* **v0.3** - April 16th, 2015
|
289
|
+
* Fix another bug with `short:true` and wrapping array values inside objects.
|
290
|
+
|
291
|
+
* **v0.2** - April 16th, 2015
|
292
|
+
* Fix bug with `short:true` and wrapping values inside objects.
|
293
|
+
|
294
|
+
* **v0.1** - April 15th, 2015
|
295
|
+
* Initial release.
|
296
|
+
|
297
|
+
[1]: https://github.com/Phrogz/NeatJSON/issues
|