oj 3.11.8 → 3.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/oj/compat.c +32 -27
- data/ext/oj/custom.c +3 -15
- data/ext/oj/dump.c +39 -42
- data/ext/oj/dump_strict.c +1 -1
- data/ext/oj/hash.c +41 -4
- data/ext/oj/hash.h +2 -0
- data/ext/oj/mimic_json.c +15 -13
- data/ext/oj/object.c +33 -5
- data/ext/oj/oj.c +116 -33
- data/ext/oj/oj.h +3 -1
- data/ext/oj/parse.h +3 -0
- data/ext/oj/scp.c +4 -16
- data/ext/oj/strict.c +67 -22
- data/ext/oj/wab.c +35 -18
- data/lib/oj/mimic.rb +2 -0
- data/lib/oj/version.rb +1 -1
- data/pages/Modes.md +2 -0
- data/pages/Options.md +23 -5
- data/test/foo.rb +2 -9
- data/test/perf.rb +1 -1
- data/test/perf_scp.rb +11 -10
- data/test/perf_strict.rb +17 -23
- data/test/test_various.rb +2 -0
- metadata +3 -3
data/ext/oj/strict.c
CHANGED
@@ -8,10 +8,65 @@
|
|
8
8
|
|
9
9
|
#include "encode.h"
|
10
10
|
#include "err.h"
|
11
|
+
#include "hash.h"
|
11
12
|
#include "oj.h"
|
12
13
|
#include "parse.h"
|
13
14
|
#include "trace.h"
|
14
15
|
|
16
|
+
VALUE oj_cstr_to_value(const char *str, size_t len, size_t cache_str) {
|
17
|
+
volatile VALUE rstr = Qnil;
|
18
|
+
|
19
|
+
if (len <= cache_str) {
|
20
|
+
VALUE *slot;
|
21
|
+
|
22
|
+
if (Qnil == (rstr = oj_str_hash_get(str, len, &slot))) {
|
23
|
+
rstr = rb_str_new(str, len);
|
24
|
+
rstr = oj_encode(rstr);
|
25
|
+
*slot = rstr;
|
26
|
+
rb_gc_register_address(slot);
|
27
|
+
}
|
28
|
+
} else {
|
29
|
+
rstr = rb_str_new(str, len);
|
30
|
+
rstr = oj_encode(rstr);
|
31
|
+
}
|
32
|
+
return rstr;
|
33
|
+
}
|
34
|
+
|
35
|
+
VALUE oj_calc_hash_key(ParseInfo pi, Val parent) {
|
36
|
+
volatile VALUE rkey = parent->key_val;
|
37
|
+
|
38
|
+
if (Qundef != rkey) {
|
39
|
+
return rkey;
|
40
|
+
}
|
41
|
+
if (Yes != pi->options.cache_keys) {
|
42
|
+
rkey = rb_str_new(parent->key, parent->klen);
|
43
|
+
rkey = oj_encode(rkey);
|
44
|
+
if (Yes == pi->options.sym_key) {
|
45
|
+
rkey = rb_str_intern(rkey);
|
46
|
+
}
|
47
|
+
return rkey;
|
48
|
+
}
|
49
|
+
VALUE *slot;
|
50
|
+
|
51
|
+
if (Yes == pi->options.sym_key) {
|
52
|
+
if (Qnil == (rkey = oj_sym_hash_get(parent->key, parent->klen, &slot))) {
|
53
|
+
rkey = rb_str_new(parent->key, parent->klen);
|
54
|
+
rkey = oj_encode(rkey);
|
55
|
+
rkey = rb_str_intern(rkey);
|
56
|
+
*slot = rkey;
|
57
|
+
rb_gc_register_address(slot);
|
58
|
+
}
|
59
|
+
} else {
|
60
|
+
if (Qnil == (rkey = oj_str_hash_get(parent->key, parent->klen, &slot))) {
|
61
|
+
rkey = rb_str_new(parent->key, parent->klen);
|
62
|
+
rkey = oj_encode(rkey);
|
63
|
+
*slot = rkey;
|
64
|
+
rb_gc_register_address(slot);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
return rkey;
|
68
|
+
}
|
69
|
+
|
15
70
|
static void hash_end(ParseInfo pi) {
|
16
71
|
if (Yes == pi->options.trace) {
|
17
72
|
oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
|
@@ -36,9 +91,8 @@ static void add_value(ParseInfo pi, VALUE val) {
|
|
36
91
|
}
|
37
92
|
|
38
93
|
static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
39
|
-
volatile VALUE rstr =
|
94
|
+
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
40
95
|
|
41
|
-
rstr = oj_encode(rstr);
|
42
96
|
pi->stack.head->val = rstr;
|
43
97
|
if (Yes == pi->options.trace) {
|
44
98
|
oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, rstr);
|
@@ -65,24 +119,12 @@ static VALUE start_hash(ParseInfo pi) {
|
|
65
119
|
return rb_hash_new();
|
66
120
|
}
|
67
121
|
|
68
|
-
static VALUE calc_hash_key(ParseInfo pi, Val parent) {
|
69
|
-
volatile VALUE rkey = parent->key_val;
|
70
|
-
|
71
|
-
if (Qundef == rkey) {
|
72
|
-
rkey = rb_str_new(parent->key, parent->klen);
|
73
|
-
}
|
74
|
-
rkey = oj_encode(rkey);
|
75
|
-
if (Yes == pi->options.sym_key) {
|
76
|
-
rkey = rb_str_intern(rkey);
|
77
|
-
}
|
78
|
-
return rkey;
|
79
|
-
}
|
80
|
-
|
81
122
|
static void hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char *orig) {
|
82
|
-
volatile VALUE rstr =
|
123
|
+
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
83
124
|
|
84
|
-
|
85
|
-
|
125
|
+
rb_hash_aset(stack_peek(&pi->stack)->val,
|
126
|
+
oj_calc_hash_key(pi, parent),
|
127
|
+
rstr);
|
86
128
|
if (Yes == pi->options.trace) {
|
87
129
|
oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
|
88
130
|
}
|
@@ -95,14 +137,18 @@ static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
|
|
95
137
|
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
|
96
138
|
}
|
97
139
|
v = oj_num_as_value(ni);
|
98
|
-
rb_hash_aset(stack_peek(&pi->stack)->val,
|
140
|
+
rb_hash_aset(stack_peek(&pi->stack)->val,
|
141
|
+
oj_calc_hash_key(pi, parent),
|
142
|
+
v);
|
99
143
|
if (Yes == pi->options.trace) {
|
100
144
|
oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, v);
|
101
145
|
}
|
102
146
|
}
|
103
147
|
|
104
148
|
static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
|
105
|
-
rb_hash_aset(stack_peek(&pi->stack)->val,
|
149
|
+
rb_hash_aset(stack_peek(&pi->stack)->val,
|
150
|
+
oj_calc_hash_key(pi, parent),
|
151
|
+
value);
|
106
152
|
if (Yes == pi->options.trace) {
|
107
153
|
oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
|
108
154
|
}
|
@@ -116,9 +162,8 @@ static VALUE start_array(ParseInfo pi) {
|
|
116
162
|
}
|
117
163
|
|
118
164
|
static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
119
|
-
volatile VALUE rstr =
|
165
|
+
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
120
166
|
|
121
|
-
rstr = oj_encode(rstr);
|
122
167
|
rb_ary_push(stack_peek(&pi->stack)->val, rstr);
|
123
168
|
if (Yes == pi->options.trace) {
|
124
169
|
oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
|
data/ext/oj/wab.c
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
#include "dump.h"
|
11
11
|
#include "encode.h"
|
12
12
|
#include "err.h"
|
13
|
+
#include "hash.h"
|
13
14
|
#include "oj.h"
|
14
15
|
#include "parse.h"
|
15
16
|
#include "trace.h"
|
@@ -292,6 +293,34 @@ void oj_dump_wab_val(VALUE obj, int depth, Out out) {
|
|
292
293
|
|
293
294
|
///// load functions /////
|
294
295
|
|
296
|
+
static VALUE calc_hash_key(ParseInfo pi, Val parent) {
|
297
|
+
volatile VALUE rkey = parent->key_val;
|
298
|
+
|
299
|
+
if (Qundef != rkey) {
|
300
|
+
rkey = oj_encode(rkey);
|
301
|
+
rkey = rb_str_intern(rkey);
|
302
|
+
|
303
|
+
return rkey;
|
304
|
+
}
|
305
|
+
if (Yes != pi->options.cache_keys) {
|
306
|
+
rkey = rb_str_new(parent->key, parent->klen);
|
307
|
+
rkey = oj_encode(rkey);
|
308
|
+
rkey = rb_str_intern(rkey);
|
309
|
+
|
310
|
+
return rkey;
|
311
|
+
}
|
312
|
+
VALUE *slot;
|
313
|
+
|
314
|
+
if (Qnil == (rkey = oj_sym_hash_get(parent->key, parent->klen, &slot))) {
|
315
|
+
rkey = rb_str_new(parent->key, parent->klen);
|
316
|
+
rkey = oj_encode(rkey);
|
317
|
+
rkey = rb_str_intern(rkey);
|
318
|
+
*slot = rkey;
|
319
|
+
rb_gc_register_address(slot);
|
320
|
+
}
|
321
|
+
return rkey;
|
322
|
+
}
|
323
|
+
|
295
324
|
static void hash_end(ParseInfo pi) {
|
296
325
|
if (Yes == pi->options.trace) {
|
297
326
|
oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
|
@@ -432,7 +461,7 @@ static VALUE protect_uri(VALUE rstr) {
|
|
432
461
|
return rb_funcall(resolve_uri_class(), oj_parse_id, 1, rstr);
|
433
462
|
}
|
434
463
|
|
435
|
-
static VALUE cstr_to_rstr(const char *str, size_t len) {
|
464
|
+
static VALUE cstr_to_rstr(ParseInfo pi, const char *str, size_t len) {
|
436
465
|
volatile VALUE v = Qnil;
|
437
466
|
|
438
467
|
if (30 == len && '-' == str[4] && '-' == str[7] && 'T' == str[10] && ':' == str[13] &&
|
@@ -445,20 +474,20 @@ static VALUE cstr_to_rstr(const char *str, size_t len) {
|
|
445
474
|
uuid_check(str, (int)len) && Qnil != resolve_wab_uuid_class()) {
|
446
475
|
return rb_funcall(wab_uuid_clas, oj_new_id, 1, rb_str_new(str, len));
|
447
476
|
}
|
448
|
-
v = rb_str_new(str, len);
|
449
477
|
if (7 < len && 0 == strncasecmp("http://", str, 7)) {
|
450
478
|
int err = 0;
|
479
|
+
v = rb_str_new(str, len);
|
451
480
|
volatile VALUE uri = rb_protect(protect_uri, v, &err);
|
452
481
|
|
453
482
|
if (0 == err) {
|
454
483
|
return uri;
|
455
484
|
}
|
456
485
|
}
|
457
|
-
return
|
486
|
+
return oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
458
487
|
}
|
459
488
|
|
460
489
|
static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
461
|
-
pi->stack.head->val = cstr_to_rstr(str, len);
|
490
|
+
pi->stack.head->val = cstr_to_rstr(pi, str, len);
|
462
491
|
if (Yes == pi->options.trace) {
|
463
492
|
oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, pi->stack.head->val);
|
464
493
|
}
|
@@ -484,20 +513,8 @@ static VALUE start_hash(ParseInfo pi) {
|
|
484
513
|
return rb_hash_new();
|
485
514
|
}
|
486
515
|
|
487
|
-
static VALUE calc_hash_key(ParseInfo pi, Val parent) {
|
488
|
-
volatile VALUE rkey = parent->key_val;
|
489
|
-
|
490
|
-
if (Qundef == rkey) {
|
491
|
-
rkey = rb_str_new(parent->key, parent->klen);
|
492
|
-
}
|
493
|
-
rkey = oj_encode(rkey);
|
494
|
-
rkey = rb_str_intern(rkey);
|
495
|
-
|
496
|
-
return rkey;
|
497
|
-
}
|
498
|
-
|
499
516
|
static void hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char *orig) {
|
500
|
-
volatile VALUE rval = cstr_to_rstr(str, len);
|
517
|
+
volatile VALUE rval = cstr_to_rstr(pi, str, len);
|
501
518
|
|
502
519
|
rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), rval);
|
503
520
|
if (Yes == pi->options.trace) {
|
@@ -533,7 +550,7 @@ static VALUE start_array(ParseInfo pi) {
|
|
533
550
|
}
|
534
551
|
|
535
552
|
static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
536
|
-
volatile VALUE rval = cstr_to_rstr(str, len);
|
553
|
+
volatile VALUE rval = cstr_to_rstr(pi, str, len);
|
537
554
|
|
538
555
|
rb_ary_push(stack_peek(&pi->stack)->val, rval);
|
539
556
|
if (Yes == pi->options.trace) {
|
data/lib/oj/mimic.rb
CHANGED
data/lib/oj/version.rb
CHANGED
data/pages/Modes.md
CHANGED
@@ -97,6 +97,8 @@ information.
|
|
97
97
|
| :bigdecimal_as_decimal | Boolean | | | | 3 | x | x | |
|
98
98
|
| :bigdecimal_load | Boolean | | | | | | x | |
|
99
99
|
| :compat_bigdecimal | Boolean | | | x | | | x | |
|
100
|
+
| :cache_keys | Boolean | x | x | x | x | | x | |
|
101
|
+
| :cache_strings | Fixnum | x | x | x | x | | x | |
|
100
102
|
| :circular | Boolean | x | x | x | x | x | x | |
|
101
103
|
| :class_cache | Boolean | | | | | x | x | |
|
102
104
|
| :create_additions | Boolean | | | x | x | | x | |
|
data/pages/Options.md
CHANGED
@@ -70,13 +70,17 @@ This can also be set with `:decimal_class` when used as a load or
|
|
70
70
|
parse option to match the JSON gem. In that case either `Float`,
|
71
71
|
`BigDecimal`, or `nil` can be provided.
|
72
72
|
|
73
|
-
### :
|
73
|
+
### :cache_keys [Boolean]
|
74
74
|
|
75
|
-
|
75
|
+
If true Hash keys are cached or interned. There are trade-offs with
|
76
|
+
caching keys. Large caches will use more memory and in extreme cases
|
77
|
+
(like over a million) the cache may be slower than not using
|
78
|
+
it. Repeated parsing of similar JSON docs is where cache_keys shines.
|
76
79
|
|
77
|
-
|
80
|
+
### :cache_strings [Int]
|
78
81
|
|
79
|
-
|
82
|
+
Shorter strings can be cached for better performance. A limit,
|
83
|
+
cache_strings, defines the upper limit on what strings are cached.
|
80
84
|
|
81
85
|
### :circular [Boolean]
|
82
86
|
|
@@ -90,6 +94,14 @@ recreate the looped references on load.
|
|
90
94
|
Cache classes for faster parsing. This option should not be used if
|
91
95
|
dynamically modifying classes or reloading classes then don't use this.
|
92
96
|
|
97
|
+
### :compat_bigdecimal [Boolean]
|
98
|
+
|
99
|
+
Determines how to load decimals when in `:compat` mode.
|
100
|
+
|
101
|
+
- `true` convert all decimal numbers to BigDecimal.
|
102
|
+
|
103
|
+
- `false` convert all decimal numbers to Float.
|
104
|
+
|
93
105
|
### :create_additions
|
94
106
|
|
95
107
|
A flag indicating that the :create_id key, when encountered during parsing,
|
@@ -251,7 +263,13 @@ compatibility. Using just indent as an integer gives better performance.
|
|
251
263
|
|
252
264
|
### :symbol_keys [Boolean]
|
253
265
|
|
254
|
-
Use symbols instead of strings for hash keys.
|
266
|
+
Use symbols instead of strings for hash keys.
|
267
|
+
|
268
|
+
### :symbolize_names [Boolean]
|
269
|
+
|
270
|
+
Like :symbol_keys has keys are made into symbols but only when
|
271
|
+
mimicing the JSON gem and then only as the JSON gem honors it so
|
272
|
+
JSON.parse honors the option but JSON.load does not.
|
255
273
|
|
256
274
|
### :trace
|
257
275
|
|
data/test/foo.rb
CHANGED
@@ -7,14 +7,7 @@ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
|
|
7
7
|
end
|
8
8
|
|
9
9
|
require 'oj'
|
10
|
-
require 'active_support'
|
11
10
|
|
12
|
-
|
11
|
+
p = Oj::Parser.new(:debug)
|
13
12
|
|
14
|
-
|
15
|
-
#Oj.mimic_JSON
|
16
|
-
begin
|
17
|
-
::JSON.load('foo=&bar')
|
18
|
-
rescue Exception => e
|
19
|
-
puts "*** #{e.class}: #{e.message}"
|
20
|
-
end
|
13
|
+
p.parse("[true, false]")
|
data/test/perf.rb
CHANGED
data/test/perf_scp.rb
CHANGED
@@ -14,16 +14,16 @@ require 'oj'
|
|
14
14
|
|
15
15
|
$verbose = false
|
16
16
|
$indent = 0
|
17
|
-
$iter =
|
17
|
+
$iter = 50_000
|
18
18
|
$with_bignum = false
|
19
|
-
$size =
|
19
|
+
$size = 1
|
20
20
|
|
21
21
|
opts = OptionParser.new
|
22
22
|
opts.on("-v", "verbose") { $verbose = true }
|
23
23
|
opts.on("-c", "--count [Int]", Integer, "iterations") { |i| $iter = i }
|
24
24
|
opts.on("-i", "--indent [Int]", Integer, "indentation") { |i| $indent = i }
|
25
|
-
opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)")
|
26
|
-
opts.on("-b", "with bignum")
|
25
|
+
opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)") { |i| $size = i }
|
26
|
+
opts.on("-b", "with bignum") { $with_bignum = true }
|
27
27
|
opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
|
28
28
|
files = opts.parse(ARGV)
|
29
29
|
|
@@ -47,7 +47,7 @@ if 0 < $size
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
Oj.default_options = { :indent => $indent, :mode => :
|
50
|
+
Oj.default_options = { :indent => $indent, :mode => :strict, cache_keys: true, cache_str: 5 }
|
51
51
|
|
52
52
|
$json = Oj.dump($obj)
|
53
53
|
$failed = {} # key is same as String used in tests later
|
@@ -105,7 +105,7 @@ class AllHandler < Oj::ScHandler
|
|
105
105
|
|
106
106
|
def hash_set(h, key, value)
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
def array_append(a, value)
|
110
110
|
end
|
111
111
|
|
@@ -137,10 +137,11 @@ end
|
|
137
137
|
puts '-' * 80
|
138
138
|
puts "Parse Performance"
|
139
139
|
perf = Perf.new()
|
140
|
-
perf.add('Oj::Saj', 'all') { Oj.saj_parse(saj_handler, $json) }
|
141
|
-
perf.add('Oj::Saj', 'none') { Oj.saj_parse(no_saj, $json) }
|
142
|
-
perf.add('Oj::Scp', 'all') { Oj.sc_parse(sc_handler, $json) }
|
143
|
-
perf.add('Oj::Scp', 'none') { Oj.sc_parse(no_handler, $json) }
|
140
|
+
perf.add('Oj::Saj.all', 'all') { Oj.saj_parse(saj_handler, $json) }
|
141
|
+
perf.add('Oj::Saj.none', 'none') { Oj.saj_parse(no_saj, $json) }
|
142
|
+
perf.add('Oj::Scp.all', 'all') { Oj.sc_parse(sc_handler, $json) }
|
143
|
+
perf.add('Oj::Scp.none', 'none') { Oj.sc_parse(no_handler, $json) }
|
144
|
+
perf.add('Oj::load', 'none') { Oj.wab_load($json) }
|
144
145
|
perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
|
145
146
|
perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new($json).parse } unless $failed.has_key?('JSON::Ext')
|
146
147
|
perf.run($iter)
|
data/test/perf_strict.rb
CHANGED
@@ -15,6 +15,8 @@ $iter = 20000
|
|
15
15
|
$with_bignum = false
|
16
16
|
$with_nums = true
|
17
17
|
$size = 0
|
18
|
+
$symbolize = false
|
19
|
+
$cache_keys = true
|
18
20
|
|
19
21
|
opts = OptionParser.new
|
20
22
|
opts.on("-v", "verbose") { $verbose = true }
|
@@ -23,6 +25,8 @@ opts.on("-i", "--indent [Int]", Integer, "indentation") { |i| $indent = i }
|
|
23
25
|
opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)") { |i| $size = i }
|
24
26
|
opts.on("-b", "with bignum") { $with_bignum = true }
|
25
27
|
opts.on("-n", "without numbers") { $with_nums = false }
|
28
|
+
opts.on("-z", "--symbolize", "symbolize keys") { $symbolize = true }
|
29
|
+
opts.on("-k", "--no-cache", "turn off key caching") { $cache_keys = false }
|
26
30
|
opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
|
27
31
|
files = opts.parse(ARGV)
|
28
32
|
|
@@ -51,7 +55,7 @@ else
|
|
51
55
|
}
|
52
56
|
end
|
53
57
|
|
54
|
-
Oj.default_options = { :indent => $indent, :mode => :strict }
|
58
|
+
Oj.default_options = { :indent => $indent, :mode => :strict, cache_keys: $cache_keys, cache_str: 5 }
|
55
59
|
|
56
60
|
if 0 < $size
|
57
61
|
o = $obj
|
@@ -62,9 +66,6 @@ if 0 < $size
|
|
62
66
|
end
|
63
67
|
|
64
68
|
$json = Oj.dump($obj)
|
65
|
-
$obj_json = Oj.dump($obj, :mode => :object)
|
66
|
-
#puts "*** size: #{$obj_json.size}"
|
67
|
-
#puts "*** #{$obj_json}"
|
68
69
|
$failed = {} # key is same as String used in tests later
|
69
70
|
|
70
71
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
@@ -77,8 +78,13 @@ def capture_error(tag, orig, load_key, dump_key, &blk)
|
|
77
78
|
end
|
78
79
|
|
79
80
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
80
|
-
capture_error('Oj:strict', $obj, 'load', 'dump') { |o|
|
81
|
-
|
81
|
+
capture_error('Oj:strict', $obj, 'load', 'dump') { |o|
|
82
|
+
Oj.strict_load(Oj.dump(o))
|
83
|
+
}
|
84
|
+
capture_error('Yajl', $obj, 'encode', 'parse') { |o|
|
85
|
+
require 'yajl'
|
86
|
+
Yajl::Parser.parse(Yajl::Encoder.encode(o))
|
87
|
+
}
|
82
88
|
capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
|
83
89
|
require 'json'
|
84
90
|
require 'json/ext'
|
@@ -86,16 +92,11 @@ capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
|
|
86
92
|
JSON.parser = JSON::Ext::Parser
|
87
93
|
JSON.parse(JSON.generate(o))
|
88
94
|
}
|
89
|
-
|
90
|
-
|
91
|
-
JSON.generator = JSON::Pure::Generator
|
92
|
-
JSON.parser = JSON::Pure::Parser
|
93
|
-
JSON.parse(JSON.generate(o))
|
94
|
-
}
|
95
|
+
|
96
|
+
Oj.default_options = { symbol_keys: $symbolize }
|
95
97
|
|
96
98
|
if $verbose
|
97
99
|
puts "json:\n#{$json}\n"
|
98
|
-
puts "object json:\n#{$obj_json}\n"
|
99
100
|
puts "Oj loaded object:\n#{Oj.strict_load($json)}\n"
|
100
101
|
puts "Yajl loaded object:\n#{Yajl::Parser.parse($json)}\n"
|
101
102
|
puts "JSON loaded object:\n#{JSON::Ext::Parser.new($json).parse}\n"
|
@@ -105,15 +106,12 @@ puts '-' * 80
|
|
105
106
|
puts "Strict Parse Performance"
|
106
107
|
perf = Perf.new()
|
107
108
|
unless $failed.has_key?('JSON::Ext')
|
108
|
-
perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
|
109
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse($json, symbolize_names: $symbolize) }
|
109
110
|
perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
|
110
111
|
end
|
111
|
-
unless $failed.has_key?('JSON::Pure')
|
112
|
-
perf.add('JSON::Pure', 'parse') { JSON.parse($json) }
|
113
|
-
perf.before('JSON::Pure') { JSON.parser = JSON::Pure::Parser }
|
114
|
-
end
|
115
112
|
unless $failed.has_key?('Oj:strict')
|
116
113
|
perf.add('Oj:strict', 'strict_load') { Oj.strict_load($json) }
|
114
|
+
perf.add('Oj:wab', 'wab_load') { Oj.wab_load($json) }
|
117
115
|
end
|
118
116
|
perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
|
119
117
|
perf.run($iter)
|
@@ -125,12 +123,8 @@ unless $failed.has_key?('JSON::Ext')
|
|
125
123
|
perf.add('JSON::Ext', 'dump') { JSON.generate($obj) }
|
126
124
|
perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
|
127
125
|
end
|
128
|
-
unless $failed.has_key?('JSON::Pure')
|
129
|
-
perf.add('JSON::Pure', 'generate') { JSON.generate($obj) }
|
130
|
-
perf.before('JSON::Pure') { JSON.generator = JSON::Pure::Generator }
|
131
|
-
end
|
132
126
|
unless $failed.has_key?('Oj:strict')
|
133
|
-
perf.add('Oj:strict', 'dump') { Oj.dump($obj
|
127
|
+
perf.add('Oj:strict', 'dump') { Oj.dump($obj) }
|
134
128
|
end
|
135
129
|
perf.add('Yajl', 'encode') { Yajl::Encoder.encode($obj) } unless $failed.has_key?('Yajl')
|
136
130
|
perf.run($iter)
|