oj 3.7.12 → 3.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -2
- data/ext/oj/custom.c +74 -48
- data/ext/oj/dump.c +46 -26
- data/ext/oj/dump.h +2 -0
- data/ext/oj/dump_compat.c +13 -9
- data/ext/oj/extconf.rb +1 -0
- data/ext/oj/mimic_json.c +7 -2
- data/ext/oj/object.c +8 -5
- data/ext/oj/oj.c +37 -27
- data/ext/oj/oj.h +8 -4
- data/ext/oj/parse.c +6 -1
- data/ext/oj/rails.c +10 -0
- data/ext/oj/resolve.c +3 -3
- data/ext/oj/sparse.c +6 -2
- data/ext/oj/string_writer.c +25 -3
- data/ext/oj/util.c +5 -5
- data/ext/oj/val_stack.c +9 -9
- data/ext/oj/val_stack.h +9 -9
- data/lib/oj/json.rb +1 -1
- data/lib/oj/version.rb +1 -1
- data/pages/Modes.md +3 -2
- data/pages/Options.md +23 -2
- data/pages/Security.md +1 -1
- data/test/bar.rb +25 -0
- data/test/foo.rb +14 -26
- data/test/test_custom.rb +99 -2
- data/test/test_various.rb +2 -0
- data/test/zoo.rb +13 -0
- metadata +71 -71
- data/test/big.rb +0 -15
- data/test/mem.rb +0 -35
data/ext/oj/dump.h
CHANGED
@@ -45,6 +45,8 @@ extern void oj_dump_rails_val(VALUE obj, int depth, Out out);
|
|
45
45
|
extern void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok);
|
46
46
|
extern void oj_dump_wab_val(VALUE obj, int depth, Out out);
|
47
47
|
|
48
|
+
extern void oj_dump_raw_json(VALUE obj, int depth, Out out);
|
49
|
+
|
48
50
|
extern VALUE oj_add_to_json(int argc, VALUE *argv, VALUE self);
|
49
51
|
extern VALUE oj_remove_to_json(int argc, VALUE *argv, VALUE self);
|
50
52
|
|
data/ext/oj/dump_compat.c
CHANGED
@@ -64,12 +64,10 @@ dump_values_array(VALUE *values, int depth, Out out) {
|
|
64
64
|
} else {
|
65
65
|
if (out->opts->dump_opts.use) {
|
66
66
|
size = d2 * out->opts->dump_opts.indent_size + out->opts->dump_opts.array_size + 2;
|
67
|
-
} else {
|
68
|
-
size = d2 * out->indent + 3;
|
69
|
-
}
|
70
|
-
if (out->opts->dump_opts.use) {
|
71
67
|
size += out->opts->dump_opts.array_size;
|
72
68
|
size += out->opts->dump_opts.indent_size;
|
69
|
+
} else {
|
70
|
+
size = d2 * out->indent + 3;
|
73
71
|
}
|
74
72
|
for (; Qundef != *values; values++) {
|
75
73
|
assure_size(out, size);
|
@@ -80,6 +78,7 @@ dump_values_array(VALUE *values, int depth, Out out) {
|
|
80
78
|
}
|
81
79
|
if (0 < out->opts->dump_opts.indent_size) {
|
82
80
|
int i;
|
81
|
+
|
83
82
|
for (i = d2; 0 < i; i--) {
|
84
83
|
strcpy(out->cur, out->opts->dump_opts.indent_str);
|
85
84
|
out->cur += out->opts->dump_opts.indent_size;
|
@@ -155,7 +154,7 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
|
|
155
154
|
if (as_ok && !oj_use_hash_alt && rb_obj_class(a) != rb_cArray && rb_respond_to(a, oj_to_json_id)) {
|
156
155
|
dump_to_json(a, out);
|
157
156
|
return;
|
158
|
-
}
|
157
|
+
}
|
159
158
|
cnt = (int)RARRAY_LEN(a);
|
160
159
|
*out->cur++ = '[';
|
161
160
|
assure_size(out, 2);
|
@@ -190,9 +189,9 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
|
|
190
189
|
*out->cur++ = ',';
|
191
190
|
}
|
192
191
|
}
|
193
|
-
size = depth * out->indent + 1;
|
194
|
-
assure_size(out, size);
|
195
192
|
if (out->opts->dump_opts.use) {
|
193
|
+
size = out->opts->dump_opts.array_size + out->opts->dump_opts.indent_size * depth + 1;
|
194
|
+
assure_size(out, size);
|
196
195
|
if (0 < out->opts->dump_opts.array_size) {
|
197
196
|
strcpy(out->cur, out->opts->dump_opts.array_nl);
|
198
197
|
out->cur += out->opts->dump_opts.array_size;
|
@@ -206,6 +205,8 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
|
|
206
205
|
}
|
207
206
|
}
|
208
207
|
} else {
|
208
|
+
size = depth * out->indent + 1;
|
209
|
+
assure_size(out, size);
|
209
210
|
fill_indent(out, depth);
|
210
211
|
}
|
211
212
|
*out->cur++ = ']';
|
@@ -715,7 +716,7 @@ dump_hash(VALUE obj, int depth, Out out, bool as_ok) {
|
|
715
716
|
if (as_ok && !oj_use_hash_alt && rb_obj_class(obj) != rb_cHash && rb_respond_to(obj, oj_to_json_id)) {
|
716
717
|
dump_to_json(obj, out);
|
717
718
|
return;
|
718
|
-
}
|
719
|
+
}
|
719
720
|
cnt = (int)RHASH_SIZE(obj);
|
720
721
|
assure_size(out, 2);
|
721
722
|
if (0 == cnt) {
|
@@ -762,9 +763,12 @@ dump_obj(VALUE obj, int depth, Out out, bool as_ok) {
|
|
762
763
|
exception_alt(obj, depth, out);
|
763
764
|
return;
|
764
765
|
}
|
766
|
+
if (Yes == out->opts->raw_json && rb_respond_to(obj, oj_raw_json_id)) {
|
767
|
+
oj_dump_raw_json(obj, depth, out);
|
768
|
+
return;
|
769
|
+
}
|
765
770
|
if (as_ok && rb_respond_to(obj, oj_to_json_id)) {
|
766
771
|
dump_to_json(obj, out);
|
767
|
-
|
768
772
|
return;
|
769
773
|
}
|
770
774
|
// Nothing else matched so encode as a JSON object with Ruby obj members
|
data/ext/oj/extconf.rb
CHANGED
data/ext/oj/mimic_json.c
CHANGED
@@ -287,7 +287,7 @@ mimic_walk(VALUE key, VALUE obj, VALUE proc) {
|
|
287
287
|
* call-seq: restore(source, proc=nil)
|
288
288
|
*
|
289
289
|
* Loads a Ruby Object from a JSON source that can be either a String or an
|
290
|
-
* IO. If Proc is given or a block is
|
290
|
+
* IO. If Proc is given or a block is provided it is called with each nested
|
291
291
|
* element of the loaded Object.
|
292
292
|
*
|
293
293
|
* - *source* [_String_|IO] JSON source
|
@@ -300,7 +300,7 @@ mimic_walk(VALUE key, VALUE obj, VALUE proc) {
|
|
300
300
|
* call-seq: load(source, proc=nil)
|
301
301
|
*
|
302
302
|
* Loads a Ruby Object from a JSON source that can be either a String or an
|
303
|
-
* IO. If Proc is given or a block is
|
303
|
+
* IO. If Proc is given or a block is provided it is called with each nested
|
304
304
|
* element of the loaded Object.
|
305
305
|
*
|
306
306
|
* - *source* [_String_|IO] JSON source
|
@@ -357,6 +357,9 @@ mimic_generate_core(int argc, VALUE *argv, Options copts) {
|
|
357
357
|
struct _out out;
|
358
358
|
VALUE rstr;
|
359
359
|
|
360
|
+
// TBD
|
361
|
+
memset(buf, 0, sizeof(buf));
|
362
|
+
|
360
363
|
out.buf = buf;
|
361
364
|
out.end = buf + sizeof(buf) - 10;
|
362
365
|
out.allocated = false;
|
@@ -677,6 +680,7 @@ static struct _options mimic_object_to_json_options = {
|
|
677
680
|
No, // to_hash
|
678
681
|
No, // to_json
|
679
682
|
No, // as_json
|
683
|
+
No, // raw_json
|
680
684
|
No, // nilnil
|
681
685
|
No, // empty_string
|
682
686
|
Yes, // allow_gc
|
@@ -685,6 +689,7 @@ static struct _options mimic_object_to_json_options = {
|
|
685
689
|
No, // create_ok
|
686
690
|
No, // allow_nan
|
687
691
|
No, // trace
|
692
|
+
No, // safe
|
688
693
|
0, // integer_range_min
|
689
694
|
0, // integer_range_max
|
690
695
|
oj_json_class,// create_id
|
data/ext/oj/object.c
CHANGED
@@ -276,7 +276,10 @@ hat_num(ParseInfo pi, Val parent, Val kval, NumInfo ni) {
|
|
276
276
|
if (2 == kval->klen) {
|
277
277
|
switch (kval->key[1]) {
|
278
278
|
case 't': // time as a float
|
279
|
-
{
|
279
|
+
if (0 == ni->div || 9 < ni->di) {
|
280
|
+
rb_raise(rb_eArgError, "Invalid time decimal representation.");
|
281
|
+
//parent->val = rb_time_nano_new(0, 0);
|
282
|
+
} else {
|
280
283
|
int64_t nsec = ni->num * 1000000000LL / ni->div;
|
281
284
|
|
282
285
|
if (ni->neg) {
|
@@ -407,7 +410,7 @@ oj_set_obj_ivar(Val parent, Val kval, VALUE value) {
|
|
407
410
|
ID var_id;
|
408
411
|
ID *slot;
|
409
412
|
|
410
|
-
#
|
413
|
+
#ifdef HAVE_PTHREAD_MUTEX_INIT
|
411
414
|
pthread_mutex_lock(&oj_cache_mutex);
|
412
415
|
#else
|
413
416
|
rb_mutex_lock(oj_cache_mutex);
|
@@ -441,7 +444,7 @@ oj_set_obj_ivar(Val parent, Val kval, VALUE value) {
|
|
441
444
|
}
|
442
445
|
*slot = var_id;
|
443
446
|
}
|
444
|
-
#
|
447
|
+
#ifdef HAVE_PTHREAD_MUTEX_INIT
|
445
448
|
pthread_mutex_unlock(&oj_cache_mutex);
|
446
449
|
#else
|
447
450
|
rb_mutex_unlock(oj_cache_mutex);
|
@@ -665,7 +668,7 @@ end_hash(ParseInfo pi) {
|
|
665
668
|
static void
|
666
669
|
array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
667
670
|
volatile VALUE rval = Qnil;
|
668
|
-
|
671
|
+
|
669
672
|
if (3 <= len && 0 != pi->circ_array) {
|
670
673
|
if ('i' == str[1]) {
|
671
674
|
long i = read_long(str + 2, len - 2);
|
@@ -694,7 +697,7 @@ array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
|
694
697
|
static void
|
695
698
|
array_append_num(ParseInfo pi, NumInfo ni) {
|
696
699
|
volatile VALUE rval = oj_num_as_value(ni);
|
697
|
-
|
700
|
+
|
698
701
|
rb_ary_push(stack_peek(&pi->stack)->val, rval);
|
699
702
|
if (Yes == pi->options.trace) {
|
700
703
|
oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
|
data/ext/oj/oj.c
CHANGED
@@ -53,6 +53,7 @@ ID oj_length_id;
|
|
53
53
|
ID oj_new_id;
|
54
54
|
ID oj_parse_id;
|
55
55
|
ID oj_pos_id;
|
56
|
+
ID oj_raw_json_id;
|
56
57
|
ID oj_read_id;
|
57
58
|
ID oj_readpartial_id;
|
58
59
|
ID oj_replace_id;
|
@@ -94,6 +95,7 @@ VALUE oj_hash_class_sym;
|
|
94
95
|
VALUE oj_indent_sym;
|
95
96
|
VALUE oj_object_class_sym;
|
96
97
|
VALUE oj_quirks_mode_sym;
|
98
|
+
VALUE oj_safe_sym;
|
97
99
|
VALUE oj_trace_sym;
|
98
100
|
|
99
101
|
static VALUE allow_blank_sym;
|
@@ -137,6 +139,7 @@ static VALUE unicode_xss_sym;
|
|
137
139
|
static VALUE unix_sym;
|
138
140
|
static VALUE unix_zone_sym;
|
139
141
|
static VALUE use_as_json_sym;
|
142
|
+
static VALUE use_raw_json_sym;
|
140
143
|
static VALUE use_to_hash_sym;
|
141
144
|
static VALUE use_to_json_sym;
|
142
145
|
static VALUE wab_sym;
|
@@ -146,7 +149,7 @@ static VALUE xss_safe_sym;
|
|
146
149
|
|
147
150
|
rb_encoding *oj_utf8_encoding = 0;
|
148
151
|
|
149
|
-
#
|
152
|
+
#ifdef HAVE_PTHREAD_MUTEX_INIT
|
150
153
|
pthread_mutex_t oj_cache_mutex;
|
151
154
|
#else
|
152
155
|
VALUE oj_cache_mutex = Qnil;
|
@@ -168,6 +171,7 @@ struct _options oj_default_options = {
|
|
168
171
|
No, // to_hash
|
169
172
|
No, // to_json
|
170
173
|
No, // as_json
|
174
|
+
No, // raw_json
|
171
175
|
No, // nilnil
|
172
176
|
Yes, // empty_string
|
173
177
|
Yes, // allow_gc
|
@@ -176,6 +180,7 @@ struct _options oj_default_options = {
|
|
176
180
|
No, // create_ok
|
177
181
|
Yes, // allow_nan
|
178
182
|
No, // trace
|
183
|
+
No, // safe
|
179
184
|
0, // integer_range_min
|
180
185
|
0, // integer_range_max
|
181
186
|
oj_json_class, // create_id
|
@@ -229,6 +234,7 @@ struct _options oj_default_options = {
|
|
229
234
|
* - *:float_precision* [_Fixnum_|_nil_] number of digits of precision when dumping floats, 0 indicates use Ruby
|
230
235
|
* - *:use_to_json* [_Boolean_|_nil_] call to_json() methods on dump, default is false
|
231
236
|
* - *:use_as_json* [_Boolean_|_nil_] call as_json() methods on dump, default is false
|
237
|
+
* - *:use_raw_json* [_Boolean_|_nil_] call raw_json() methods on dump, default is false
|
232
238
|
* - *:nilnil* [_Boolean_|_nil_] if true a nil input to load will return nil and not raise an Exception
|
233
239
|
* - *:empty_string* [_Boolean_|_nil_] if true an empty input will not raise an Exception
|
234
240
|
* - *:allow_gc* [_Boolean_|_nil_] allow or prohibit GC during parsing, default is true (allow)
|
@@ -245,8 +251,9 @@ struct _options oj_default_options = {
|
|
245
251
|
* - *:array_class* [_Class_|_nil_] Class to use instead of Array on load
|
246
252
|
* - *:omit_nil* [_true_|_false_] if true Hash and Object attributes with nil values are omitted
|
247
253
|
* - *:ignore* [_nil_|Array] either nil or an Array of classes to ignore when dumping
|
248
|
-
* - *:integer_range* [_Range_] Dump integers outside range as strings.
|
254
|
+
* - *:integer_range* [_Range_] Dump integers outside range as strings.
|
249
255
|
* - *:trace* [_true,_|_false_] Trace all load and dump calls, default is false (trace is off)
|
256
|
+
* - *:safe* [_true,_|_false_] Safe mimic breaks JSON mimic to be safer, default is false (safe is off)
|
250
257
|
*
|
251
258
|
* Return [_Hash_] all current option settings.
|
252
259
|
*/
|
@@ -269,6 +276,7 @@ get_def_opts(VALUE self) {
|
|
269
276
|
rb_hash_aset(opts, use_to_json_sym, (Yes == oj_default_options.to_json) ? Qtrue : ((No == oj_default_options.to_json) ? Qfalse : Qnil));
|
270
277
|
rb_hash_aset(opts, use_to_hash_sym, (Yes == oj_default_options.to_hash) ? Qtrue : ((No == oj_default_options.to_hash) ? Qfalse : Qnil));
|
271
278
|
rb_hash_aset(opts, use_as_json_sym, (Yes == oj_default_options.as_json) ? Qtrue : ((No == oj_default_options.as_json) ? Qfalse : Qnil));
|
279
|
+
rb_hash_aset(opts, use_raw_json_sym, (Yes == oj_default_options.raw_json) ? Qtrue : ((No == oj_default_options.raw_json) ? Qfalse : Qnil));
|
272
280
|
rb_hash_aset(opts, nilnil_sym, (Yes == oj_default_options.nilnil) ? Qtrue : ((No == oj_default_options.nilnil) ? Qfalse : Qnil));
|
273
281
|
rb_hash_aset(opts, empty_string_sym, (Yes == oj_default_options.empty_string) ? Qtrue : ((No == oj_default_options.empty_string) ? Qfalse : Qnil));
|
274
282
|
rb_hash_aset(opts, allow_gc_sym, (Yes == oj_default_options.allow_gc) ? Qtrue : ((No == oj_default_options.allow_gc) ? Qfalse : Qnil));
|
@@ -276,6 +284,7 @@ get_def_opts(VALUE self) {
|
|
276
284
|
rb_hash_aset(opts, allow_invalid_unicode_sym, (Yes == oj_default_options.allow_invalid) ? Qtrue : ((No == oj_default_options.allow_invalid) ? Qfalse : Qnil));
|
277
285
|
rb_hash_aset(opts, oj_allow_nan_sym, (Yes == oj_default_options.allow_nan) ? Qtrue : ((No == oj_default_options.allow_nan) ? Qfalse : Qnil));
|
278
286
|
rb_hash_aset(opts, oj_trace_sym, (Yes == oj_default_options.trace) ? Qtrue : ((No == oj_default_options.trace) ? Qfalse : Qnil));
|
287
|
+
rb_hash_aset(opts, oj_safe_sym, (Yes == oj_default_options.safe) ? Qtrue : ((No == oj_default_options.safe) ? Qfalse : Qnil));
|
279
288
|
rb_hash_aset(opts, float_prec_sym, INT2FIX(oj_default_options.float_prec));
|
280
289
|
switch (oj_default_options.mode) {
|
281
290
|
case StrictMode: rb_hash_aset(opts, mode_sym, strict_sym); break;
|
@@ -287,7 +296,7 @@ get_def_opts(VALUE self) {
|
|
287
296
|
case WabMode: rb_hash_aset(opts, mode_sym, wab_sym); break;
|
288
297
|
default: rb_hash_aset(opts, mode_sym, object_sym); break;
|
289
298
|
}
|
290
|
-
|
299
|
+
|
291
300
|
if (oj_default_options.integer_range_max != 0 || oj_default_options.integer_range_min != 0) {
|
292
301
|
VALUE range = rb_obj_alloc(rb_cRange);
|
293
302
|
VALUE min = LONG2FIX(oj_default_options.integer_range_min);
|
@@ -320,7 +329,7 @@ get_def_opts(VALUE self) {
|
|
320
329
|
case AutoDec:
|
321
330
|
default: rb_hash_aset(opts, bigdecimal_load_sym, auto_sym); break;
|
322
331
|
}
|
323
|
-
rb_hash_aset(opts, create_id_sym, (
|
332
|
+
rb_hash_aset(opts, create_id_sym, (NULL == oj_default_options.create_id) ? Qnil : rb_str_new2(oj_default_options.create_id));
|
324
333
|
rb_hash_aset(opts, oj_space_sym, (0 == oj_default_options.dump_opts.after_size) ? Qnil : rb_str_new2(oj_default_options.dump_opts.after_sep));
|
325
334
|
rb_hash_aset(opts, oj_space_before_sym, (0 == oj_default_options.dump_opts.before_size) ? Qnil : rb_str_new2(oj_default_options.dump_opts.before_sep));
|
326
335
|
rb_hash_aset(opts, oj_object_nl_sym, (0 == oj_default_options.dump_opts.hash_size) ? Qnil : rb_str_new2(oj_default_options.dump_opts.hash_nl));
|
@@ -343,7 +352,7 @@ get_def_opts(VALUE self) {
|
|
343
352
|
} else {
|
344
353
|
VALUE *vp;
|
345
354
|
volatile VALUE a = rb_ary_new();
|
346
|
-
|
355
|
+
|
347
356
|
for (vp = oj_default_options.ignore; Qnil != *vp; vp++) {
|
348
357
|
rb_ary_push(a, *vp);
|
349
358
|
}
|
@@ -374,6 +383,7 @@ get_def_opts(VALUE self) {
|
|
374
383
|
* - *:use_to_json* [_Boolean_|_nil_] call to_json() methods on dump, default is false.
|
375
384
|
* - *:use_as_json* [_Boolean_|_nil_] call as_json() methods on dump, default is false.
|
376
385
|
* - *:use_to_hash* [_Boolean_|_nil_] call to_hash() methods on dump, default is false.
|
386
|
+
* - *:use_raw_json* [_Boolean_|_nil_] call raw_json() methods on dump, default is false.
|
377
387
|
* - *:nilnil* [_Boolean_|_nil_] if true a nil input to load will return nil and not raise an Exception.
|
378
388
|
* - *:allow_gc* [_Boolean_|_nil_] allow or prohibit GC during parsing, default is true (allow).
|
379
389
|
* - *:quirks_mode* [_Boolean_|_nil_] allow single JSON values instead of documents, default is true (allow).
|
@@ -388,8 +398,9 @@ get_def_opts(VALUE self) {
|
|
388
398
|
* - *:array_class* [_Class_|_nil_] Class to use instead of Array on load.
|
389
399
|
* - *:omit_nil* [_true_|_false_] if true Hash and Object attributes with nil values are omitted.
|
390
400
|
* - *:ignore* [_nil_|Array] either nil or an Array of classes to ignore when dumping
|
391
|
-
* - *:integer_range* [_Range_] Dump integers outside range as strings.
|
401
|
+
* - *:integer_range* [_Range_] Dump integers outside range as strings.
|
392
402
|
* - *:trace* [_Boolean_] turn trace on or off.
|
403
|
+
* - *:safe* [_Boolean_] turn safe mimic on or off.
|
393
404
|
*/
|
394
405
|
static VALUE
|
395
406
|
set_def_opts(VALUE self, VALUE opts) {
|
@@ -410,6 +421,7 @@ oj_parse_options(VALUE ropts, Options copts) {
|
|
410
421
|
{ use_to_hash_sym, &copts->to_hash },
|
411
422
|
{ use_to_json_sym, &copts->to_json },
|
412
423
|
{ use_as_json_sym, &copts->as_json },
|
424
|
+
{ use_raw_json_sym, &copts->raw_json },
|
413
425
|
{ nilnil_sym, &copts->nilnil },
|
414
426
|
{ allow_blank_sym, &copts->nilnil }, // same as nilnil
|
415
427
|
{ empty_string_sym, &copts->empty_string },
|
@@ -418,13 +430,14 @@ oj_parse_options(VALUE ropts, Options copts) {
|
|
418
430
|
{ allow_invalid_unicode_sym, &copts->allow_invalid },
|
419
431
|
{ oj_allow_nan_sym, &copts->allow_nan },
|
420
432
|
{ oj_trace_sym, &copts->trace },
|
433
|
+
{ oj_safe_sym, &copts->safe },
|
421
434
|
{ oj_create_additions_sym, &copts->create_ok },
|
422
435
|
{ Qnil, 0 }
|
423
436
|
};
|
424
437
|
YesNoOpt o;
|
425
438
|
volatile VALUE v;
|
426
439
|
size_t len;
|
427
|
-
|
440
|
+
|
428
441
|
if (T_HASH != rb_type(ropts)) {
|
429
442
|
return;
|
430
443
|
}
|
@@ -715,7 +728,7 @@ oj_parse_options(VALUE ropts, Options copts) {
|
|
715
728
|
cnt = (int)RARRAY_LEN(v);
|
716
729
|
if (0 < cnt) {
|
717
730
|
int i;
|
718
|
-
|
731
|
+
|
719
732
|
copts->ignore = ALLOC_N(VALUE, cnt + 1);
|
720
733
|
for (i = 0; i < cnt; i++) {
|
721
734
|
copts->ignore[i] = rb_ary_entry(v, i);
|
@@ -802,11 +815,10 @@ oj_parse_opt_match_string(RxClass rc, VALUE ropts) {
|
|
802
815
|
*
|
803
816
|
* - *json* [_String_|_IO_] JSON String or an Object that responds to read()
|
804
817
|
* - *options* [_Hash_] load options (same as default_options)
|
805
|
-
* - -
|
806
818
|
* - *obj* [_Hash_|_Array_|_String_|_Fixnum_|_Float_|_Boolean_|_nil_] parsed object.
|
807
819
|
* - *start* [_optional, _Integer_] start position of parsed JSON for obj.
|
808
820
|
* - *len* [_optional, _Integer_] length of parsed JSON for obj.
|
809
|
-
*
|
821
|
+
*
|
810
822
|
* Returns [_Hash_|_Array_|_String_|_Fixnum_|_Float_|_Boolean_|_nil_]
|
811
823
|
*/
|
812
824
|
static VALUE
|
@@ -889,7 +901,6 @@ load(int argc, VALUE *argv, VALUE self) {
|
|
889
901
|
*
|
890
902
|
* - *path* [_String_] to a file containing a JSON document
|
891
903
|
* - *options* [_Hash_] load options (same as default_options)
|
892
|
-
* - -
|
893
904
|
* - *obj* [_Hash_|_Array_|_String_|_Fixnum_|_Float_|_Boolean_|_nil_] parsed object.
|
894
905
|
* - *start* [_optional, _Integer_] start position of parsed JSON for obj.
|
895
906
|
* - *len* [_optional, _Integer_] length of parsed JSON for obj.
|
@@ -1064,7 +1075,7 @@ dump(int argc, VALUE *argv, VALUE self) {
|
|
1064
1075
|
* Dumps an Object (obj) to a string. If the object has a to_json method that
|
1065
1076
|
* will be called. The mode is set to :compat.
|
1066
1077
|
* - *obj* [_Object_] Object to serialize as an JSON document String
|
1067
|
-
* - *options* [_Hash_]
|
1078
|
+
* - *options* [_Hash_]
|
1068
1079
|
* - *:max_nesting* [_boolean_] It true nesting is limited to 100. The option to detect circular references is available but is not compatible with the json gem., default is false
|
1069
1080
|
* - *:allow_nan* [_boolean_] If true non JSON compliant words such as Nan and Infinity will be used as appropriate, default is true.
|
1070
1081
|
* - *:quirks_mode* [_boolean_] Allow single JSON values instead of documents, default is true (allow).
|
@@ -1126,7 +1137,7 @@ to_json(int argc, VALUE *argv, VALUE self) {
|
|
1126
1137
|
static VALUE
|
1127
1138
|
to_file(int argc, VALUE *argv, VALUE self) {
|
1128
1139
|
struct _options copts = oj_default_options;
|
1129
|
-
|
1140
|
+
|
1130
1141
|
if (3 == argc) {
|
1131
1142
|
oj_parse_options(argv[2], &copts);
|
1132
1143
|
}
|
@@ -1149,7 +1160,7 @@ to_file(int argc, VALUE *argv, VALUE self) {
|
|
1149
1160
|
static VALUE
|
1150
1161
|
to_stream(int argc, VALUE *argv, VALUE self) {
|
1151
1162
|
struct _options copts = oj_default_options;
|
1152
|
-
|
1163
|
+
|
1153
1164
|
if (3 == argc) {
|
1154
1165
|
oj_parse_options(argv[2], &copts);
|
1155
1166
|
}
|
@@ -1265,7 +1276,6 @@ register_odd_raw(int argc, VALUE *argv, VALUE self) {
|
|
1265
1276
|
*
|
1266
1277
|
* - *json* [_String_|_IO_] JSON String or an Object that responds to read().
|
1267
1278
|
* - *options* [_Hash_] load options (same as default_options).
|
1268
|
-
* - -
|
1269
1279
|
* - *obj* [_Hash_|_Array_|_String_|_Fixnum_|_Float_|_Boolean_|_nil_] parsed object.
|
1270
1280
|
* - *start* [_optional, _Integer_] start position of parsed JSON for obj.
|
1271
1281
|
* - *len* [_optional, _Integer_] length of parsed JSON for obj.
|
@@ -1300,7 +1310,6 @@ extern VALUE oj_strict_parse(int argc, VALUE *argv, VALUE self);
|
|
1300
1310
|
*
|
1301
1311
|
* - *json* [_String_|_IO_] JSON String or an Object that responds to read().
|
1302
1312
|
* - *options* [_Hash_] load options (same as default_options).
|
1303
|
-
* - -
|
1304
1313
|
* - *obj* [_Hash_|_Array_|_String_|_Fixnum_|_Float_|_Boolean_|_nil_] parsed object.
|
1305
1314
|
* - *start* [_optional, _Integer_] start position of parsed JSON for obj.
|
1306
1315
|
* - *len* [_optional, _Integer_] length of parsed JSON for obj.
|
@@ -1331,7 +1340,6 @@ extern VALUE oj_compat_parse(int argc, VALUE *argv, VALUE self);
|
|
1331
1340
|
*
|
1332
1341
|
* - *json* [_String_|_IO_] JSON String or an Object that responds to read().
|
1333
1342
|
* - *options* [_Hash_] load options (same as default_options).
|
1334
|
-
* - -
|
1335
1343
|
* - *obj* [_Hash_|_Array_|_String_|_Fixnum_|_Float_|_Boolean_|_nil_] parsed object.
|
1336
1344
|
* - *start* [_optional, _Integer_] start position of parsed JSON for obj.
|
1337
1345
|
* - *len* [_optional, _Integer_] length of parsed JSON for obj.
|
@@ -1367,7 +1375,6 @@ extern VALUE oj_object_parse(int argc, VALUE *argv, VALUE self);
|
|
1367
1375
|
*
|
1368
1376
|
* - *json* [_String_|_IO_] JSON String or an Object that responds to read().
|
1369
1377
|
* - *options* [_Hash_] load options (same as default_options).
|
1370
|
-
* - -
|
1371
1378
|
* - *obj* [_Hash_|_Array_|_String_|_Fixnum_|_Float_|_Boolean_|_nil_] parsed object.
|
1372
1379
|
* - *start* [_optional, _Integer_] start position of parsed JSON for obj.
|
1373
1380
|
* - *len* [_optional, _Integer_] length of parsed JSON for obj.
|
@@ -1429,16 +1436,16 @@ extern VALUE oj_define_mimic_json(int argc, VALUE *argv, VALUE self);
|
|
1429
1436
|
|
1430
1437
|
/* Document-method: generate
|
1431
1438
|
* call-seq: generate(obj, opts=nil)
|
1432
|
-
*
|
1439
|
+
*
|
1433
1440
|
* Encode obj as a JSON String. The obj argument must be a Hash, Array, or
|
1434
1441
|
* respond to to_h or to_json. Options other than those listed such as
|
1435
1442
|
* +:allow_nan+ or +:max_nesting+ are ignored.
|
1436
|
-
*
|
1443
|
+
*
|
1437
1444
|
* - *obj* [_Object__|_Hash_|_Array_] object to convert to a JSON String
|
1438
1445
|
* - *opts* [_Hash_] options
|
1439
|
-
*
|
1446
|
+
* - *:indent* [_String_] String to use for indentation.
|
1440
1447
|
* - *:space* [_String_] String placed after a , or : delimiter
|
1441
|
-
* - *:
|
1448
|
+
* - *:space_before* [_String_] String placed before a : delimiter
|
1442
1449
|
* - *:object_nl* [_String_] String placed after a JSON object
|
1443
1450
|
* - *:array_nl* [_String_] String placed after a JSON array
|
1444
1451
|
* - *:ascii_only* [_Boolean_] if not nil or false then use only ascii characters in the output. Note JSON.generate does support this even if it is not documented.
|
@@ -1481,15 +1488,15 @@ protect_require(VALUE x) {
|
|
1481
1488
|
* modes are:
|
1482
1489
|
*
|
1483
1490
|
* - *:strict* mode will only allow the 7 basic JSON types to be serialized. Any other Object
|
1484
|
-
* will raise an Exception.
|
1485
|
-
*
|
1491
|
+
* will raise an Exception.
|
1492
|
+
*
|
1486
1493
|
* - *:null* mode is similar to the :strict mode except any Object that is not
|
1487
1494
|
* one of the JSON base types is replaced by a JSON null.
|
1488
|
-
*
|
1495
|
+
*
|
1489
1496
|
* - *:object* mode will dump any Object as a JSON Object with keys that match
|
1490
1497
|
* the Ruby Object's variable names without the '@' character. This is the
|
1491
1498
|
* highest performance mode.
|
1492
|
-
*
|
1499
|
+
*
|
1493
1500
|
* - *:compat* or *:json* mode is the compatible mode for the json gem. It mimics
|
1494
1501
|
* the json gem including the options, defaults, and restrictions.
|
1495
1502
|
*
|
@@ -1575,6 +1582,7 @@ Init_oj() {
|
|
1575
1582
|
oj_new_id = rb_intern("new");
|
1576
1583
|
oj_parse_id = rb_intern("parse");
|
1577
1584
|
oj_pos_id = rb_intern("pos");
|
1585
|
+
oj_raw_json_id = rb_intern("raw_json");
|
1578
1586
|
oj_read_id = rb_intern("read");
|
1579
1587
|
oj_readpartial_id = rb_intern("readpartial");
|
1580
1588
|
oj_replace_id = rb_intern("replace");
|
@@ -1651,6 +1659,7 @@ Init_oj() {
|
|
1651
1659
|
oj_object_class_sym = ID2SYM(rb_intern("object_class")); rb_gc_register_address(&oj_object_class_sym);
|
1652
1660
|
oj_object_nl_sym = ID2SYM(rb_intern("object_nl")); rb_gc_register_address(&oj_object_nl_sym);
|
1653
1661
|
oj_quirks_mode_sym = ID2SYM(rb_intern("quirks_mode")); rb_gc_register_address(&oj_quirks_mode_sym);
|
1662
|
+
oj_safe_sym = ID2SYM(rb_intern("safe")); rb_gc_register_address(&oj_safe_sym);
|
1654
1663
|
oj_space_before_sym = ID2SYM(rb_intern("space_before")); rb_gc_register_address(&oj_space_before_sym);
|
1655
1664
|
oj_space_sym = ID2SYM(rb_intern("space")); rb_gc_register_address(&oj_space_sym);
|
1656
1665
|
oj_trace_sym = ID2SYM(rb_intern("trace")); rb_gc_register_address(&oj_trace_sym);
|
@@ -1666,6 +1675,7 @@ Init_oj() {
|
|
1666
1675
|
unix_sym = ID2SYM(rb_intern("unix")); rb_gc_register_address(&unix_sym);
|
1667
1676
|
unix_zone_sym = ID2SYM(rb_intern("unix_zone")); rb_gc_register_address(&unix_zone_sym);
|
1668
1677
|
use_as_json_sym = ID2SYM(rb_intern("use_as_json")); rb_gc_register_address(&use_as_json_sym);
|
1678
|
+
use_raw_json_sym = ID2SYM(rb_intern("use_raw_json")); rb_gc_register_address(&use_raw_json_sym);
|
1669
1679
|
use_to_hash_sym = ID2SYM(rb_intern("use_to_hash")); rb_gc_register_address(&use_to_hash_sym);
|
1670
1680
|
use_to_json_sym = ID2SYM(rb_intern("use_to_json")); rb_gc_register_address(&use_to_json_sym);
|
1671
1681
|
wab_sym = ID2SYM(rb_intern("wab")); rb_gc_register_address(&wab_sym);
|
@@ -1682,7 +1692,7 @@ Init_oj() {
|
|
1682
1692
|
oj_odd_init();
|
1683
1693
|
oj_mimic_rails_init();
|
1684
1694
|
|
1685
|
-
#
|
1695
|
+
#ifdef HAVE_PTHREAD_MUTEX_INIT
|
1686
1696
|
if (0 != (err = pthread_mutex_init(&oj_cache_mutex, 0))) {
|
1687
1697
|
rb_raise(rb_eException, "failed to initialize a mutex. %s", strerror(err));
|
1688
1698
|
}
|