Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 447 lines (341 sloc) 20.494 kB
6248665 ready for use with limitations
Peter Ohler authored
1 # Oj gem
2 A fast JSON parser and Object marshaller as a Ruby gem.
3
4 ## <a name="installation">Installation</a>
5 gem install oj
6
03e53b8 updated readme
Peter Ohler authored
7 ## <a name="documentation">Documentation</a>
6248665 ready for use with limitations
Peter Ohler authored
8
1ee8e1f updated readme
Peter Ohler authored
9 *Documentation*: https://www.ohler.com/oj
10
11 ## <a name="source">Source</a>
12
6248665 ready for use with limitations
Peter Ohler authored
13 *GitHub* *repo*: https://github.com/ohler55/oj
14
15 *RubyGems* *repo*: https://rubygems.org/gems/oj
16
1ee8e1f updated readme
Peter Ohler authored
17 ## <a name="follow">Follow @oxgem on Twitter</a>
18
19 [Follow @peterohler on Twitter](http://twitter.com/#!/peterohler) for announcements and news about the Oj gem.
20
6248665 ready for use with limitations
Peter Ohler authored
21 ## <a name="build_status">Build Status</a>
22
da0330c getting the travis image to show status
Peter Ohler authored
23 [![Build Status](https://secure.travis-ci.org/ohler55/oj.png?branch=master)](http://travis-ci.org/ohler55/oj)
6248665 ready for use with limitations
Peter Ohler authored
24
25 ## <a name="links">Links of Interest</a>
26
e900e8e updated links and home page
Peter Ohler authored
27 [Need for Speed](http://www.ohler.com/dev/need_for_speed/need_for_speed.html) for an overview of how Oj::Doc was designed.
f5aae61 docs completed, ready for a release
Peter Ohler authored
28
afe4e99 changed json object format
Peter Ohler authored
29 *Fast XML parser and marshaller on RubyGems*: https://rubygems.org/gems/ox
6248665 ready for use with limitations
Peter Ohler authored
30
db33462 @MSNexploder fixed ox GitHub link
MSNexploder authored
31 *Fast XML parser and marshaller on GitHub*: https://github.com/ohler55/ox
57afd74 fixed a few bugs and added options
Peter Ohler authored
32
afe4e99 changed json object format
Peter Ohler authored
33 ## <a name="release">Release Notes</a>
6248665 ready for use with limitations
Peter Ohler authored
34
e27b76d added option to control maximum stack use for JSON strings
Peter Ohler authored
35 ### Release 1.2.11
36
37 - Added :max_stack option to limit the size of string allocated on the stack.
38
c9bb99f adding new encodings
Peter Ohler authored
39 ### Release 1.2.10
2444b99 pushing changes to readme that were lost in previous push
Peter Ohler authored
40
41 - Added check for circular on loading of circular dumped JSON.
42
499d9c8 almost ready for 1.2.10 release
Peter Ohler authored
43 - Added support for direct serialization of BigDecimal, Rational, Date, and DateTime.
c9bb99f adding new encodings
Peter Ohler authored
44
45 - Added json.rb to $" in mimic mode to avoid pulling in the real JSON by accident.
46
47 - Oj is now thread safe for all functions.
100b871 making timespec compatible
Peter Ohler authored
48
499d9c8 almost ready for 1.2.10 release
Peter Ohler authored
49 - The / (solidus) character is now placed in strings without being escaped.
50
6248665 ready for use with limitations
Peter Ohler authored
51 ## <a name="description">Description</a>
52
53 Optimized JSON (Oj), as the name implies was written to provide speed
54 optimized JSON handling. It was designed as a faster alternative to Yajl and
55 other the common Ruby JSON parsers. So far is has achieved that at about 2
56 time faster than Yajl for parsing and 3 or more times faster writing JSON.
57
8711c85 serializes any Object now. Tests added as well.
Peter Ohler authored
58 Oj has several dump or serialization modes which control how Objects are
1a4aead @mat :effort parameter really is :mode.
mat authored
59 converted to JSON. These modes are set with the :mode option in either the
e0fb1d3 updatings docs and notes
Peter Ohler authored
60 default options or as one of the options to the dump() method.
61
62 - :strict mode will only allow the 7 basic JSON types to be serialized. Any other Object
63 will raise and Exception.
64
65 - :null mode replaces any Object that is not one of the JSON types is replaced by a JSON null.
66
67 - :object mode will dump any Object as a JSON Object with keys that match the
68 Ruby Object's variable names without the '@' character. This is the highest
69 performance mode.
70
71 - :compat mode is is the compatible with other systems. It will serialize any
72 Object but will check to see if the Object implements a to_hash() or to_json()
73 method. If either exists that method is used for serializing the Object. The
74 to_hash() is more flexible and produces more consistent output so it has a
75 preference over the to_json() method. If neither the to_json() or to_hash()
76 methods exist then the Oj internal Object variable encoding is used.
8711c85 serializes any Object now. Tests added as well.
Peter Ohler authored
77
4c6363a added comment in readme about using jruby
Peter Ohler authored
78 Oj is compatible with Ruby 1.8.7, 1.9.2, 1.9.3, JRuby, RBX, and the latest
79 2.0dev. Note that JRuby now disables support for extentions by default. JRuby
80 can be build with extensions enabled. Check the documenation for JRuby
81 installs in your environment.
d4a2c32 updated readme
Peter Ohler authored
82
83 Oj is also compatible with Rails. Just make sure the Oj gem is installed and
84 [multi_json](https://github.com/intridea/multi_json) will pick it up and use it.
5b248cc added Bag class and auto_define flag
Peter Ohler authored
85
6669206 ready for 0.6.0 release
Peter Ohler authored
86 ## <a name="compare">Comparisons</a>
87
f5aae61 docs completed, ready for a release
Peter Ohler authored
88 ### Fast Oj::Doc parser comparisons
89
90 The fast Oj::Doc parser is compared to the Yajl and JSON::Pure parsers with
91 strict JSON documents. No object conversions are included, just simple JSON.
92
93 Since the Oj::Doc deviation from the conventional parsers comparisons of not
94 only parsing but data access is also included. These tests use the
95 perf_fast.rb test file. The first benchmark is for just parsing. The second is
96 for doing a get on every leaf value in the JSON data structure. The third
97 fetchs a value from a specific spot in the document. With Yajl and JSON this
98 is done with a set of calls to fetch() for each level in the document. For
99 Oj::Doc a single fetch with a path is used.
100
101 The benchmark results are:
102
103 > perf_fast.rb -g 1 -f
104 --------------------------------------------------------------------------------
105 Parse Performance
106 Oj::Doc.parse 100000 times in 0.164 seconds or 609893.696 parse/sec.
107 Yajl.parse 100000 times in 3.168 seconds or 31569.902 parse/sec.
108 JSON::Ext.parse 100000 times in 3.282 seconds or 30464.826 parse/sec.
109
110 Summary:
111 System time (secs) rate (ops/sec)
112 --------- ----------- --------------
113 Oj::Doc 0.164 609893.696
114 Yajl 3.168 31569.902
115 JSON::Ext 3.282 30464.826
116
117 Comparison Matrix
118 (performance factor, 2.0 row is means twice as fast as column)
119 Oj::Doc Yajl JSON::Ext
120 --------- --------- --------- ---------
121 Oj::Doc 1.00 19.32 20.02
122 Yajl 0.05 1.00 1.04
123 JSON::Ext 0.05 0.96 1.00
124
125 --------------------------------------------------------------------------------
126 Parse and get all values Performance
127 Oj::Doc.parse 100000 times in 0.417 seconds or 240054.540 parse/sec.
128 Yajl.parse 100000 times in 5.159 seconds or 19384.191 parse/sec.
129 JSON::Ext.parse 100000 times in 5.269 seconds or 18978.638 parse/sec.
130
131 Summary:
132 System time (secs) rate (ops/sec)
133 --------- ----------- --------------
134 Oj::Doc 0.417 240054.540
135 Yajl 5.159 19384.191
136 JSON::Ext 5.269 18978.638
137
138 Comparison Matrix
139 (performance factor, 2.0 row is means twice as fast as column)
140 Oj::Doc Yajl JSON::Ext
141 --------- --------- --------- ---------
142 Oj::Doc 1.00 12.38 12.65
143 Yajl 0.08 1.00 1.02
144 JSON::Ext 0.08 0.98 1.00
145
146 --------------------------------------------------------------------------------
147 fetch nested Performance
148 Oj::Doc.fetch 100000 times in 0.094 seconds or 1059995.760 fetch/sec.
149 Ruby.fetch 100000 times in 0.503 seconds or 198851.434 fetch/sec.
150
151 Summary:
152 System time (secs) rate (ops/sec)
153 ------- ----------- --------------
154 Oj::Doc 0.094 1059995.760
155 Ruby 0.503 198851.434
156
157 Comparison Matrix
158 (performance factor, 2.0 row is means twice as fast as column)
159 Oj::Doc Ruby
160 ------- ------- -------
161 Oj::Doc 1.00 5.33
162 Ruby 0.19 1.00
163
164 What the results mean are that for getting just a few values from a JSON
165 document Oj::Doc is 20 times faster than any other parser and for accessing
166 all values it is still over 12 times faster than any other Ruby JSON parser.
167
168 ### Conventional Oj parser comparisons
169
6669206 ready for 0.6.0 release
Peter Ohler authored
170 The following table shows the difference is speeds between several
f5aae61 docs completed, ready for a release
Peter Ohler authored
171 serialization packages compared to the more conventional Oj parser. The tests
172 had to be scaled back due to limitation of some of the gems. I finally gave up
173 trying to get JSON Pure to serialize without errors with Ruby 1.9.3. It had
174 internal errors on anything other than a simple JSON structure. The errors
175 encountered were:
6669206 ready for 0.6.0 release
Peter Ohler authored
176
177 - MessagePack fails to convert Bignum to JSON
178
e0fb1d3 updatings docs and notes
Peter Ohler authored
179 - JSON Pure fails to serialize any numbers or Objects with the to_json() method
6669206 ready for 0.6.0 release
Peter Ohler authored
180
e0fb1d3 updatings docs and notes
Peter Ohler authored
181 Options were added to the test/perf_strict.rb test to run the test without
182 Object encoding and without Bignums.
6669206 ready for 0.6.0 release
Peter Ohler authored
183
184 None of the packages except Oj were able to serialize Ruby Objects that did
185 not have a to_json() method or were of the 7 native JSON types.
186
5b248cc added Bag class and auto_define flag
Peter Ohler authored
187 A perf_obj.rb file was added for comparing different Object marshalling
188 packages.
189
6669206 ready for 0.6.0 release
Peter Ohler authored
190 It is also worth noting that although Oj is slightly behind MessagePack for
191 parsing, Oj serialization is much faster than MessagePack even though Oj uses
192 human readable JSON vs the binary MessagePack format.
193
f5aae61 docs completed, ready for a release
Peter Ohler authored
194 Oj supports circular references when in :object mode and when the :circular
6b22c57 finishing off circular reference implementation
Peter Ohler authored
195 flag is true. None of the other gems tested supported circular
196 references. They failed in the following manners when the input included
197 circular references.
198
199 - Yajl core dumps Ruby
200
201 - JSON fails and raises an Exception
202
203 - MessagePack fails and raises an Exception
204
205 The benchmark results are:
6669206 ready for 0.6.0 release
Peter Ohler authored
206
207 with Object and Bignum encoding:
208
53e3bbc added benchmarks
Peter Ohler authored
209 > perf_strict.rb
6234873 ready for a release
Peter Ohler authored
210 --------------------------------------------------------------------------------
211 Load/Parse Performance
53e3bbc added benchmarks
Peter Ohler authored
212 Oj:compat.load 100000 times in 1.481 seconds or 67513.146 load/sec.
213 Oj.load 100000 times in 1.066 seconds or 93796.400 load/sec.
214 JSON::Ext.parse 100000 times in 3.023 seconds or 33074.875 parse/sec.
215 JSON::Pure.parse 100000 times in 18.908 seconds or 5288.799 parse/sec.
216 Ox.load 100000 times in 1.240 seconds or 80671.900 load/sec.
6234873 ready for a release
Peter Ohler authored
217
218 Summary:
219 System time (secs) rate (ops/sec)
220 ---------- ----------- --------------
53e3bbc added benchmarks
Peter Ohler authored
221 Oj 1.066 93796.400
222 Ox 1.240 80671.900
223 Oj:compat 1.481 67513.146
224 JSON::Ext 3.023 33074.875
225 JSON::Pure 18.908 5288.799
6234873 ready for a release
Peter Ohler authored
226
227 Comparison Matrix
228 (performance factor, 2.0 row is means twice as fast as column)
53e3bbc added benchmarks
Peter Ohler authored
229 Oj Ox Oj:compat JSON::Ext JSON::Pure
6234873 ready for a release
Peter Ohler authored
230 ---------- ---------- ---------- ---------- ---------- ----------
53e3bbc added benchmarks
Peter Ohler authored
231 Oj 1.00 1.16 1.39 2.84 17.73
232 Ox 0.86 1.00 1.19 2.44 15.25
233 Oj:compat 0.72 0.84 1.00 2.04 12.77
234 JSON::Ext 0.35 0.41 0.49 1.00 6.25
235 JSON::Pure 0.06 0.07 0.08 0.16 1.00
6234873 ready for a release
Peter Ohler authored
236
237
238 --------------------------------------------------------------------------------
239 Dump/Encode/Generate Performance
53e3bbc added benchmarks
Peter Ohler authored
240 Oj:compat.dump 100000 times in 0.789 seconds or 126715.249 dump/sec.
241 Oj.dump 100000 times in 0.457 seconds or 218798.751 dump/sec.
242 JSON::Ext.generate 100000 times in 4.371 seconds or 22878.630 generate/sec.
243 Ox.dump 100000 times in 0.501 seconds or 199425.256 dump/sec.
6234873 ready for a release
Peter Ohler authored
244
245 Summary:
246 System time (secs) rate (ops/sec)
247 --------- ----------- --------------
53e3bbc added benchmarks
Peter Ohler authored
248 Oj 0.457 218798.751
249 Ox 0.501 199425.256
250 Oj:compat 0.789 126715.249
251 JSON::Ext 4.371 22878.630
6234873 ready for a release
Peter Ohler authored
252
253 Comparison Matrix
254 (performance factor, 2.0 row is means twice as fast as column)
53e3bbc added benchmarks
Peter Ohler authored
255 Oj Ox Oj:compat JSON::Ext
6234873 ready for a release
Peter Ohler authored
256 --------- --------- --------- --------- ---------
53e3bbc added benchmarks
Peter Ohler authored
257 Oj 1.00 1.10 1.73 9.56
258 Ox 0.91 1.00 1.57 8.72
259 Oj:compat 0.58 0.64 1.00 5.54
260 JSON::Ext 0.10 0.11 0.18 1.00
261
262
263 The following packages were not included for the reason listed
264 ***** MessagePack: RangeError: bignum too big to convert into `unsigned long long'
265 ***** Yajl: RuntimeError: Yajl parse and encode did not return the same object as the original.
266 ***** JSON::Pure: TypeError: wrong argument type JSON::Pure::Generator::State (expected Data)
6669206 ready for 0.6.0 release
Peter Ohler authored
267
53e3bbc added benchmarks
Peter Ohler authored
268 without Objects or numbers (for JSON Pure, Yajl, and Messagepack) JSON:
6669206 ready for 0.6.0 release
Peter Ohler authored
269
6234873 ready for a release
Peter Ohler authored
270 --------------------------------------------------------------------------------
271 Load/Parse Performance
53e3bbc added benchmarks
Peter Ohler authored
272 Oj:compat.load 100000 times in 0.806 seconds or 124051.164 load/sec.
273 Oj.load 100000 times in 0.810 seconds or 123384.587 load/sec.
274 Yajl.parse 100000 times in 1.441 seconds or 69385.996 parse/sec.
275 JSON::Ext.parse 100000 times in 1.567 seconds or 63797.848 parse/sec.
276 JSON::Pure.parse 100000 times in 13.500 seconds or 7407.247 parse/sec.
277 Ox.load 100000 times in 0.954 seconds or 104836.748 load/sec.
278 MessagePack.unpack 100000 times in 0.651 seconds or 153707.817 unpack/sec.
6234873 ready for a release
Peter Ohler authored
279
280 Summary:
281 System time (secs) rate (ops/sec)
282 ----------- ----------- --------------
53e3bbc added benchmarks
Peter Ohler authored
283 MessagePack 0.651 153707.817
284 Oj:compat 0.806 124051.164
285 Oj 0.810 123384.587
286 Ox 0.954 104836.748
287 Yajl 1.441 69385.996
288 JSON::Ext 1.567 63797.848
289 JSON::Pure 13.500 7407.247
6234873 ready for a release
Peter Ohler authored
290
291 Comparison Matrix
292 (performance factor, 2.0 row is means twice as fast as column)
53e3bbc added benchmarks
Peter Ohler authored
293 MessagePack Oj:compat Oj Ox Yajl JSON::Ext JSON::Pure
294 ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
295 MessagePack 1.00 1.24 1.25 1.47 2.22 2.41 20.75
296 Oj:compat 0.81 1.00 1.01 1.18 1.79 1.94 16.75
297 Oj 0.80 0.99 1.00 1.18 1.78 1.93 16.66
298 Ox 0.68 0.85 0.85 1.00 1.51 1.64 14.15
299 Yajl 0.45 0.56 0.56 0.66 1.00 1.09 9.37
300 JSON::Ext 0.42 0.51 0.52 0.61 0.92 1.00 8.61
301 JSON::Pure 0.05 0.06 0.06 0.07 0.11 0.12 1.00
6234873 ready for a release
Peter Ohler authored
302
303
304 --------------------------------------------------------------------------------
305 Dump/Encode/Generate Performance
53e3bbc added benchmarks
Peter Ohler authored
306 Oj:compat.dump 100000 times in 0.173 seconds or 578526.262 dump/sec.
307 Oj.dump 100000 times in 0.179 seconds or 558362.880 dump/sec.
308 Yajl.encode 100000 times in 0.776 seconds or 128794.279 encode/sec.
309 JSON::Ext.generate 100000 times in 3.511 seconds or 28483.812 generate/sec.
310 JSON::Pure.generate 100000 times in 7.389 seconds or 13533.717 generate/sec.
311 Ox.dump 100000 times in 0.196 seconds or 510589.629 dump/sec.
312 MessagePack.pack 100000 times in 0.317 seconds or 315307.220 pack/sec.
6234873 ready for a release
Peter Ohler authored
313
314 Summary:
315 System time (secs) rate (ops/sec)
316 ----------- ----------- --------------
53e3bbc added benchmarks
Peter Ohler authored
317 Oj:compat 0.173 578526.262
318 Oj 0.179 558362.880
319 Ox 0.196 510589.629
320 MessagePack 0.317 315307.220
321 Yajl 0.776 128794.279
322 JSON::Ext 3.511 28483.812
323 JSON::Pure 7.389 13533.717
6234873 ready for a release
Peter Ohler authored
324
325 Comparison Matrix
326 (performance factor, 2.0 row is means twice as fast as column)
53e3bbc added benchmarks
Peter Ohler authored
327 Oj:compat Oj Ox MessagePack Yajl JSON::Ext JSON::Pure
328 ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
329 Oj:compat 1.00 1.04 1.13 1.83 4.49 20.31 42.75
330 Oj 0.97 1.00 1.09 1.77 4.34 19.60 41.26
331 Ox 0.88 0.91 1.00 1.62 3.96 17.93 37.73
332 MessagePack 0.55 0.56 0.62 1.00 2.45 11.07 23.30
333 Yajl 0.22 0.23 0.25 0.41 1.00 4.52 9.52
334 JSON::Ext 0.05 0.05 0.06 0.09 0.22 1.00 2.10
335 JSON::Pure 0.02 0.02 0.03 0.04 0.11 0.48 1.00
6234873 ready for a release
Peter Ohler authored
336
6248665 ready for use with limitations
Peter Ohler authored
337 ### Simple JSON Writing and Parsing:
338
339 require 'oj'
340
341 h = { 'one' => 1, 'array' => [ true, false ] }
342 json = Oj.dump(h)
343
344 # json =
345 # {
346 # "one":1,
347 # "array":[
348 # true,
349 # false
350 # ]
351 # }
352
9b9a86f @sferik Fix typo
sferik authored
353 h2 = Oj.load(json)
6248665 ready for use with limitations
Peter Ohler authored
354 puts "Same? #{h == h2}"
355 # true
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
356
357 ### Object JSON format:
358
359 In :object mode Oj generates JSON that follows conventions which allow Class
360 and other information such as Object IDs for circular reference detection. The
361 formating follows the following rules.
362
363 1. JSON native types, true, false, nil, String, Hash, Array, and Number are
364 encoded normally.
365
6b22c57 finishing off circular reference implementation
Peter Ohler authored
366 2. A Symbol is encoded as a JSON string with a preceeding `:` character.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
367
6b22c57 finishing off circular reference implementation
Peter Ohler authored
368 3. The `^` character denotes a special key value when in a JSON Object sequence.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
369
6b22c57 finishing off circular reference implementation
Peter Ohler authored
370 4. A Ruby String that starts with `:` or the sequence `^i` or `^r` are encoded by
371 excaping the first character so that it appears as `\u005e` or `\u003a` instead of
372 `:` or `^`.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
373
6b22c57 finishing off circular reference implementation
Peter Ohler authored
374 5. A `"^c"` JSON Object key indicates the value should be converted to a Ruby
375 class. The sequence `{"^c":"Oj::Bag"}` is read as the Oj::Bag class.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
376
6b22c57 finishing off circular reference implementation
Peter Ohler authored
377 6. A `"^t"` JSON Object key indicates the value should be converted to a Ruby
c9bb99f adding new encodings
Peter Ohler authored
378 Time. The sequence `{"^t":1325775487.000000}` is read as Jan 5, 2012 at
499d9c8 almost ready for 1.2.10 release
Peter Ohler authored
379 23:58:07.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
380
c9bb99f adding new encodings
Peter Ohler authored
381 7. A `"^o"` JSON Object key indicates the value should be converted to a Ruby
6b22c57 finishing off circular reference implementation
Peter Ohler authored
382 Object. The first entry in the JSON Object must be a class with the `"^o"`
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
383 key. After that each entry is treated as a variable of the Object where the
6b22c57 finishing off circular reference implementation
Peter Ohler authored
384 key is the variable name without the preceeding `@`. An example is
499d9c8 almost ready for 1.2.10 release
Peter Ohler authored
385 `{"^o":"Oj::Bag","x":58,"y":"marbles"}`. `"^O"` is the same except that it is
386 for built in or odd classes that don't obey the normal Ruby rules. Examples
387 are Rational, Date, and DateTime.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
388
6b22c57 finishing off circular reference implementation
Peter Ohler authored
389 8. A `"^u"` JSON Object key indicates the value should be converted to a Ruby
390 Struct. The first entry in the JSON Object must be a class with the `"^u"`
0dfa515 now dumping struct in the correct format. Loading still unimplemented
Peter Ohler authored
391 key. After that each entry is is given a numeric position in the struct and
6b22c57 finishing off circular reference implementation
Peter Ohler authored
392 that is used as the key in the JSON Object. An example is `{"^u":["Range",1,7,false]}`.
0dfa515 now dumping struct in the correct format. Loading still unimplemented
Peter Ohler authored
393
6b22c57 finishing off circular reference implementation
Peter Ohler authored
394 9. When encoding an Object, if the variable name does not begin with an `@`
395 character then the name preceeded by a `~` character. This occurs in the
396 Exception class. An example is `{"^o":"StandardError","~mesg":"A Message","~bt":[".\/tests.rb:345:in `test_exception'"]}`.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
397
6b22c57 finishing off circular reference implementation
Peter Ohler authored
398 10. If a Hash entry has a key that is not a String or Symbol then the entry is
399 encoded with a key of the form `"^#n"` where n is a hex number. The value that
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
400 is an Array where the first element is the key in the Hash and the second is
6b22c57 finishing off circular reference implementation
Peter Ohler authored
401 the value. An example is `{"^#3":[2,5]}`.
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
402
6b22c57 finishing off circular reference implementation
Peter Ohler authored
403 11. A `"^i"` JSON entry in either an Object or Array is the ID of the Ruby
4d28d2c updated readme with message format for object encoding
Peter Ohler authored
404 Object being encoded. It is used when the :circular flag is set. It can appear
6b22c57 finishing off circular reference implementation
Peter Ohler authored
405 in either a JSON Object or in a JSON Array. In an Object the `"^i"` key has a
fdacd8d added hash circular support
Peter Ohler authored
406 corresponding reference Fixnum. In an array the sequence will include an
407 embedded reference number. An example is
6b22c57 finishing off circular reference implementation
Peter Ohler authored
408 `{"^o":"Oj::Bag","^i":1,"x":["^i2",true],"me":"^r1"}`.
409
410 12. A `"^r"` JSON entry in an Object is a references to a Object or Array that
411 already appears in the JSON String. It must match up with a previous `"^i"`
412 ID. An example is `{"^o":"Oj::Bag","^i":1,"x":3,"me":"^r1"}`.
fdacd8d added hash circular support
Peter Ohler authored
413
6b22c57 finishing off circular reference implementation
Peter Ohler authored
414 13. If an Array element is a String and starts with `"^i"` then the first
415 character, the `^` is encoded as a hex character sequence. An example is
416 `["\u005ei37",3]`.
fdacd8d added hash circular support
Peter Ohler authored
417
6b22c57 finishing off circular reference implementation
Peter Ohler authored
418 ### License:
419
420 Copyright (c) 2012, Peter Ohler
421 All rights reserved.
422
423 Redistribution and use in source and binary forms, with or without
424 modification, are permitted provided that the following conditions are met:
425
426 - Redistributions of source code must retain the above copyright notice, this
427 list of conditions and the following disclaimer.
428
429 - Redistributions in binary form must reproduce the above copyright notice,
430 this list of conditions and the following disclaimer in the documentation
431 and/or other materials provided with the distribution.
432
433 - Neither the name of Peter Ohler nor the names of its contributors may be
434 used to endorse or promote products derived from this software without
435 specific prior written permission.
436
437 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
438 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
439 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
440 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
441 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
442 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
443 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
444 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
445 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
446 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Something went wrong with that request. Please try again.