json 2.0.4 → 2.3.0
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 +5 -5
- data/.gitignore +1 -0
- data/.travis.yml +9 -4
- data/CHANGES.md +6 -0
- data/Gemfile +1 -3
- data/LICENSE +56 -0
- data/README.md +38 -21
- data/Rakefile +12 -7
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +96 -40
- data/ext/json/ext/parser/parser.c +124 -80
- data/ext/json/ext/parser/parser.h +1 -0
- data/ext/json/ext/parser/parser.rl +51 -7
- data/java/src/json/ext/Generator.java +33 -10
- data/java/src/json/ext/Parser.java +95 -80
- data/java/src/json/ext/Parser.rl +25 -10
- data/json-java.gemspec +1 -2
- data/json.gemspec +0 -0
- data/json_pure.gemspec +5 -5
- data/lib/json/add/bigdecimal.rb +2 -2
- data/lib/json/add/complex.rb +2 -2
- data/lib/json/add/ostruct.rb +1 -1
- data/lib/json/add/rational.rb +2 -2
- data/lib/json/add/regexp.rb +2 -2
- data/lib/json/add/set.rb +29 -0
- data/lib/json/common.rb +2 -2
- data/lib/json/pure/generator.rb +2 -1
- data/lib/json/pure/parser.rb +13 -1
- data/lib/json/version.rb +1 -1
- data/tests/json_addition_test.rb +10 -0
- data/tests/json_common_interface_test.rb +4 -4
- data/tests/json_encoding_test.rb +2 -2
- data/tests/json_generator_test.rb +44 -0
- data/tests/json_parser_test.rb +18 -12
- data/tests/test_helper.rb +0 -4
- metadata +5 -7
- data/data/example.json +0 -1
- data/data/index.html +0 -38
- data/data/prototype.js +0 -4184
data/java/src/json/ext/Parser.rl
CHANGED
|
@@ -52,7 +52,8 @@ public class Parser extends RubyObject {
|
|
|
52
52
|
private boolean symbolizeNames;
|
|
53
53
|
private RubyClass objectClass;
|
|
54
54
|
private RubyClass arrayClass;
|
|
55
|
-
private
|
|
55
|
+
private RubyClass decimalClass;
|
|
56
|
+
private RubyHash match_string;
|
|
56
57
|
|
|
57
58
|
private static final int DEFAULT_MAX_NESTING = 100;
|
|
58
59
|
|
|
@@ -131,6 +132,10 @@ public class Parser extends RubyObject {
|
|
|
131
132
|
* <dt><code>:array_class</code>
|
|
132
133
|
* <dd>Defaults to Array.
|
|
133
134
|
*
|
|
135
|
+
* <dt><code>:decimal_class</code>
|
|
136
|
+
* <dd>Specifies which class to use instead of the default (Float) when
|
|
137
|
+
* parsing decimal numbers. This class must accept a single string argument
|
|
138
|
+
* in its constructor.
|
|
134
139
|
* </dl>
|
|
135
140
|
*/
|
|
136
141
|
@JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
|
|
@@ -157,7 +162,8 @@ public class Parser extends RubyObject {
|
|
|
157
162
|
this.createAdditions = opts.getBool("create_additions", false);
|
|
158
163
|
this.objectClass = opts.getClass("object_class", runtime.getHash());
|
|
159
164
|
this.arrayClass = opts.getClass("array_class", runtime.getArray());
|
|
160
|
-
this.
|
|
165
|
+
this.decimalClass = opts.getClass("decimal_class", null);
|
|
166
|
+
this.match_string = opts.getHash("match_string");
|
|
161
167
|
|
|
162
168
|
if(symbolizeNames && createAdditions) {
|
|
163
169
|
throw runtime.newArgumentError(
|
|
@@ -489,13 +495,13 @@ public class Parser extends RubyObject {
|
|
|
489
495
|
|
|
490
496
|
return p;
|
|
491
497
|
}
|
|
492
|
-
|
|
498
|
+
|
|
493
499
|
RubyInteger createInteger(int p, int new_p) {
|
|
494
500
|
Ruby runtime = getRuntime();
|
|
495
501
|
ByteList num = absSubSequence(p, new_p);
|
|
496
502
|
return bytesToInum(runtime, num);
|
|
497
503
|
}
|
|
498
|
-
|
|
504
|
+
|
|
499
505
|
RubyInteger bytesToInum(Ruby runtime, ByteList num) {
|
|
500
506
|
return runtime.is1_9() ?
|
|
501
507
|
ConvertBytes.byteListToInum19(runtime, num, 10, true) :
|
|
@@ -525,7 +531,9 @@ public class Parser extends RubyObject {
|
|
|
525
531
|
res.update(null, p);
|
|
526
532
|
return;
|
|
527
533
|
}
|
|
528
|
-
|
|
534
|
+
IRubyObject number = parser.decimalClass == null ?
|
|
535
|
+
createFloat(p, new_p) : createCustomDecimal(p, new_p);
|
|
536
|
+
|
|
529
537
|
res.update(number, new_p + 1);
|
|
530
538
|
return;
|
|
531
539
|
}
|
|
@@ -540,16 +548,23 @@ public class Parser extends RubyObject {
|
|
|
540
548
|
if (cs < JSON_float_first_final) {
|
|
541
549
|
return -1;
|
|
542
550
|
}
|
|
543
|
-
|
|
551
|
+
|
|
544
552
|
return p;
|
|
545
553
|
}
|
|
546
|
-
|
|
554
|
+
|
|
547
555
|
RubyFloat createFloat(int p, int new_p) {
|
|
548
556
|
Ruby runtime = getRuntime();
|
|
549
557
|
ByteList num = absSubSequence(p, new_p);
|
|
550
558
|
return RubyFloat.newFloat(runtime, dc.parse(num, true, runtime.is1_9()));
|
|
551
559
|
}
|
|
552
560
|
|
|
561
|
+
IRubyObject createCustomDecimal(int p, int new_p) {
|
|
562
|
+
Ruby runtime = getRuntime();
|
|
563
|
+
ByteList num = absSubSequence(p, new_p);
|
|
564
|
+
IRubyObject numString = runtime.newString(num.toString());
|
|
565
|
+
return parser.decimalClass.callMethod(context, "new", numString);
|
|
566
|
+
}
|
|
567
|
+
|
|
553
568
|
%%{
|
|
554
569
|
machine JSON_string;
|
|
555
570
|
include JSON_common;
|
|
@@ -592,7 +607,7 @@ public class Parser extends RubyObject {
|
|
|
592
607
|
%% write exec;
|
|
593
608
|
|
|
594
609
|
if (parser.createAdditions) {
|
|
595
|
-
RubyHash matchString = parser.
|
|
610
|
+
RubyHash matchString = parser.match_string;
|
|
596
611
|
if (matchString != null) {
|
|
597
612
|
final IRubyObject[] memoArray = { result, null };
|
|
598
613
|
try {
|
|
@@ -616,7 +631,7 @@ public class Parser extends RubyObject {
|
|
|
616
631
|
}
|
|
617
632
|
}
|
|
618
633
|
|
|
619
|
-
if (cs >= JSON_string_first_final && result != null) {
|
|
634
|
+
if (cs >= JSON_string_first_final && result != null) {
|
|
620
635
|
if (result instanceof RubyString) {
|
|
621
636
|
((RubyString)result).force_encoding(context, info.utf8.get());
|
|
622
637
|
}
|
|
@@ -734,7 +749,7 @@ public class Parser extends RubyObject {
|
|
|
734
749
|
fhold;
|
|
735
750
|
fbreak;
|
|
736
751
|
}
|
|
737
|
-
|
|
752
|
+
|
|
738
753
|
pair = ignore* begin_name >parse_name ignore* name_separator
|
|
739
754
|
ignore* begin_value >parse_value;
|
|
740
755
|
next_pair = ignore* value_separator pair;
|
data/json-java.gemspec
CHANGED
|
@@ -8,9 +8,8 @@ spec = Gem::Specification.new do |s|
|
|
|
8
8
|
s.description = "A JSON implementation as a JRuby extension."
|
|
9
9
|
s.author = "Daniel Luz"
|
|
10
10
|
s.email = "dev+ruby@mernen.com"
|
|
11
|
-
s.homepage = "http://
|
|
11
|
+
s.homepage = "http://flori.github.com/json"
|
|
12
12
|
s.platform = 'java'
|
|
13
|
-
s.rubyforge_project = "json-jruby"
|
|
14
13
|
s.licenses = ["Ruby"]
|
|
15
14
|
|
|
16
15
|
s.files = Dir["{docs,lib,tests}/**/*"]
|
data/json.gemspec
CHANGED
|
Binary file
|
data/json_pure.gemspec
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
# stub: json_pure 2.0
|
|
2
|
+
# stub: json_pure 2.3.0 ruby lib
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |s|
|
|
5
5
|
s.name = "json_pure".freeze
|
|
6
|
-
s.version = "2.0
|
|
6
|
+
s.version = "2.3.0"
|
|
7
7
|
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
9
9
|
s.require_paths = ["lib".freeze]
|
|
10
10
|
s.authors = ["Florian Frank".freeze]
|
|
11
|
-
s.date = "
|
|
11
|
+
s.date = "2019-12-11"
|
|
12
12
|
s.description = "This is a JSON implementation in pure Ruby.".freeze
|
|
13
13
|
s.email = "flori@ping.de".freeze
|
|
14
14
|
s.extra_rdoc_files = ["README.md".freeze]
|
|
15
|
-
s.files = ["./tests/test_helper.rb".freeze, ".gitignore".freeze, ".travis.yml".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "README-json-jruby.md".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "
|
|
15
|
+
s.files = ["./tests/test_helper.rb".freeze, ".gitignore".freeze, ".travis.yml".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README-json-jruby.md".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "diagrams/.keep".freeze, "ext/json/ext/fbuffer/fbuffer.h".freeze, "ext/json/ext/generator/depend".freeze, "ext/json/ext/generator/extconf.rb".freeze, "ext/json/ext/generator/generator.c".freeze, "ext/json/ext/generator/generator.h".freeze, "ext/json/ext/parser/depend".freeze, "ext/json/ext/parser/extconf.rb".freeze, "ext/json/ext/parser/parser.c".freeze, "ext/json/ext/parser/parser.h".freeze, "ext/json/ext/parser/parser.rl".freeze, "ext/json/extconf.rb".freeze, "install.rb".freeze, "java/src/json/ext/ByteListTranscoder.java".freeze, "java/src/json/ext/Generator.java".freeze, "java/src/json/ext/GeneratorMethods.java".freeze, "java/src/json/ext/GeneratorService.java".freeze, "java/src/json/ext/GeneratorState.java".freeze, "java/src/json/ext/OptionsReader.java".freeze, "java/src/json/ext/Parser.java".freeze, "java/src/json/ext/Parser.rl".freeze, "java/src/json/ext/ParserService.java".freeze, "java/src/json/ext/RuntimeInfo.java".freeze, "java/src/json/ext/StringDecoder.java".freeze, "java/src/json/ext/StringEncoder.java".freeze, "java/src/json/ext/Utils.java".freeze, "json-java.gemspec".freeze, "json.gemspec".freeze, "json_pure.gemspec".freeze, "lib/json.rb".freeze, "lib/json/add/bigdecimal.rb".freeze, "lib/json/add/complex.rb".freeze, "lib/json/add/core.rb".freeze, "lib/json/add/date.rb".freeze, "lib/json/add/date_time.rb".freeze, "lib/json/add/exception.rb".freeze, "lib/json/add/ostruct.rb".freeze, "lib/json/add/range.rb".freeze, "lib/json/add/rational.rb".freeze, "lib/json/add/regexp.rb".freeze, "lib/json/add/set.rb".freeze, "lib/json/add/struct.rb".freeze, "lib/json/add/symbol.rb".freeze, "lib/json/add/time.rb".freeze, "lib/json/common.rb".freeze, "lib/json/ext.rb".freeze, "lib/json/ext/.keep".freeze, "lib/json/generic_object.rb".freeze, "lib/json/pure.rb".freeze, "lib/json/pure/generator.rb".freeze, "lib/json/pure/parser.rb".freeze, "lib/json/version.rb".freeze, "references/rfc7159.txt".freeze, "tests/fixtures/fail10.json".freeze, "tests/fixtures/fail11.json".freeze, "tests/fixtures/fail12.json".freeze, "tests/fixtures/fail13.json".freeze, "tests/fixtures/fail14.json".freeze, "tests/fixtures/fail18.json".freeze, "tests/fixtures/fail19.json".freeze, "tests/fixtures/fail2.json".freeze, "tests/fixtures/fail20.json".freeze, "tests/fixtures/fail21.json".freeze, "tests/fixtures/fail22.json".freeze, "tests/fixtures/fail23.json".freeze, "tests/fixtures/fail24.json".freeze, "tests/fixtures/fail25.json".freeze, "tests/fixtures/fail27.json".freeze, "tests/fixtures/fail28.json".freeze, "tests/fixtures/fail3.json".freeze, "tests/fixtures/fail4.json".freeze, "tests/fixtures/fail5.json".freeze, "tests/fixtures/fail6.json".freeze, "tests/fixtures/fail7.json".freeze, "tests/fixtures/fail8.json".freeze, "tests/fixtures/fail9.json".freeze, "tests/fixtures/obsolete_fail1.json".freeze, "tests/fixtures/pass1.json".freeze, "tests/fixtures/pass15.json".freeze, "tests/fixtures/pass16.json".freeze, "tests/fixtures/pass17.json".freeze, "tests/fixtures/pass2.json".freeze, "tests/fixtures/pass26.json".freeze, "tests/fixtures/pass3.json".freeze, "tests/json_addition_test.rb".freeze, "tests/json_common_interface_test.rb".freeze, "tests/json_encoding_test.rb".freeze, "tests/json_ext_parser_test.rb".freeze, "tests/json_fixtures_test.rb".freeze, "tests/json_generator_test.rb".freeze, "tests/json_generic_object_test.rb".freeze, "tests/json_parser_test.rb".freeze, "tests/json_string_matching_test.rb".freeze, "tests/test_helper.rb".freeze, "tools/diff.sh".freeze, "tools/fuzz.rb".freeze, "tools/server.rb".freeze]
|
|
16
16
|
s.homepage = "http://flori.github.com/json".freeze
|
|
17
17
|
s.licenses = ["Ruby".freeze]
|
|
18
18
|
s.rdoc_options = ["--title".freeze, "JSON implemention for ruby".freeze, "--main".freeze, "README.md".freeze]
|
|
19
19
|
s.required_ruby_version = Gem::Requirement.new(">= 1.9".freeze)
|
|
20
|
-
s.rubygems_version = "
|
|
20
|
+
s.rubygems_version = "3.0.3".freeze
|
|
21
21
|
s.summary = "JSON Implementation for Ruby".freeze
|
|
22
22
|
s.test_files = ["./tests/test_helper.rb".freeze]
|
|
23
23
|
|
data/lib/json/add/bigdecimal.rb
CHANGED
data/lib/json/add/complex.rb
CHANGED
data/lib/json/add/ostruct.rb
CHANGED
data/lib/json/add/rational.rb
CHANGED
data/lib/json/add/regexp.rb
CHANGED
data/lib/json/add/set.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
|
|
2
|
+
require 'json'
|
|
3
|
+
end
|
|
4
|
+
defined?(::Set) or require 'set'
|
|
5
|
+
|
|
6
|
+
class Set
|
|
7
|
+
# Import a JSON Marshalled object.
|
|
8
|
+
#
|
|
9
|
+
# method used for JSON marshalling support.
|
|
10
|
+
def self.json_create(object)
|
|
11
|
+
new object['a']
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Marshal the object to JSON.
|
|
15
|
+
#
|
|
16
|
+
# method used for JSON marshalling support.
|
|
17
|
+
def as_json(*)
|
|
18
|
+
{
|
|
19
|
+
JSON.create_id => self.class.name,
|
|
20
|
+
'a' => to_a,
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# return the JSON value
|
|
25
|
+
def to_json(*args)
|
|
26
|
+
as_json.to_json(*args)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
data/lib/json/common.rb
CHANGED
|
@@ -153,7 +153,7 @@ module JSON
|
|
|
153
153
|
# * *object_class*: Defaults to Hash
|
|
154
154
|
# * *array_class*: Defaults to Array
|
|
155
155
|
def parse(source, opts = {})
|
|
156
|
-
Parser.new(source, opts).parse
|
|
156
|
+
Parser.new(source, **(opts||{})).parse
|
|
157
157
|
end
|
|
158
158
|
|
|
159
159
|
# Parse the JSON document _source_ into a Ruby data structure and return it.
|
|
@@ -176,7 +176,7 @@ module JSON
|
|
|
176
176
|
:max_nesting => false,
|
|
177
177
|
:allow_nan => true
|
|
178
178
|
}.merge(opts)
|
|
179
|
-
Parser.new(source, opts).parse
|
|
179
|
+
Parser.new(source, **(opts||{})).parse
|
|
180
180
|
end
|
|
181
181
|
|
|
182
182
|
# Generate a JSON document from the Ruby data structure _obj_ and return
|
data/lib/json/pure/generator.rb
CHANGED
data/lib/json/pure/parser.rb
CHANGED
|
@@ -70,6 +70,9 @@ module JSON
|
|
|
70
70
|
# option defaults to false.
|
|
71
71
|
# * *object_class*: Defaults to Hash
|
|
72
72
|
# * *array_class*: Defaults to Array
|
|
73
|
+
# * *decimal_class*: Specifies which class to use instead of the default
|
|
74
|
+
# (Float) when parsing decimal numbers. This class must accept a single
|
|
75
|
+
# string argument in its constructor.
|
|
73
76
|
def initialize(source, opts = {})
|
|
74
77
|
opts ||= {}
|
|
75
78
|
source = convert_encoding source
|
|
@@ -94,6 +97,7 @@ module JSON
|
|
|
94
97
|
@create_id = @create_additions ? JSON.create_id : nil
|
|
95
98
|
@object_class = opts[:object_class] || Hash
|
|
96
99
|
@array_class = opts[:array_class] || Array
|
|
100
|
+
@decimal_class = opts[:decimal_class]
|
|
97
101
|
@match_string = opts[:match_string]
|
|
98
102
|
end
|
|
99
103
|
|
|
@@ -193,7 +197,15 @@ module JSON
|
|
|
193
197
|
def parse_value
|
|
194
198
|
case
|
|
195
199
|
when scan(FLOAT)
|
|
196
|
-
|
|
200
|
+
if @decimal_class then
|
|
201
|
+
if @decimal_class == BigDecimal then
|
|
202
|
+
BigDecimal(self[1])
|
|
203
|
+
else
|
|
204
|
+
@decimal_class.new(self[1]) || Float(self[1])
|
|
205
|
+
end
|
|
206
|
+
else
|
|
207
|
+
Float(self[1])
|
|
208
|
+
end
|
|
197
209
|
when scan(INTEGER)
|
|
198
210
|
Integer(self[1])
|
|
199
211
|
when scan(TRUE)
|
data/lib/json/version.rb
CHANGED
data/tests/json_addition_test.rb
CHANGED
|
@@ -5,6 +5,7 @@ require 'json/add/complex'
|
|
|
5
5
|
require 'json/add/rational'
|
|
6
6
|
require 'json/add/bigdecimal'
|
|
7
7
|
require 'json/add/ostruct'
|
|
8
|
+
require 'json/add/set'
|
|
8
9
|
require 'date'
|
|
9
10
|
|
|
10
11
|
class JSONAdditionTest < Test::Unit::TestCase
|
|
@@ -190,4 +191,13 @@ class JSONAdditionTest < Test::Unit::TestCase
|
|
|
190
191
|
o.foo = { 'bar' => true }
|
|
191
192
|
assert_equal o, parse(JSON(o), :create_additions => true)
|
|
192
193
|
end
|
|
194
|
+
|
|
195
|
+
def test_set
|
|
196
|
+
s = Set.new([:a, :b, :c, :a])
|
|
197
|
+
assert_equal s, JSON.parse(JSON(s), :create_additions => true)
|
|
198
|
+
ss = SortedSet.new([:d, :b, :a, :c])
|
|
199
|
+
ss_again = JSON.parse(JSON(ss), :create_additions => true)
|
|
200
|
+
assert_kind_of ss.class, ss_again
|
|
201
|
+
assert_equal ss, ss_again
|
|
202
|
+
end
|
|
193
203
|
end
|
|
@@ -27,15 +27,15 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def test_parser
|
|
30
|
-
assert_match
|
|
30
|
+
assert_match(/::Parser\z/, JSON.parser.name)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def test_generator
|
|
34
|
-
assert_match
|
|
34
|
+
assert_match(/::Generator\z/, JSON.generator.name)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def test_state
|
|
38
|
-
assert_match
|
|
38
|
+
assert_match(/::Generator::State\z/, JSON.state.name)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def test_create_id
|
|
@@ -56,7 +56,7 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
|
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def test_parse_bang
|
|
59
|
-
assert_equal [ 1,
|
|
59
|
+
assert_equal [ 1, Infinity, 3, ], JSON.parse!('[ 1, Infinity, 3 ]')
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
def test_generate
|
data/tests/json_encoding_test.rb
CHANGED
|
@@ -79,8 +79,8 @@ class JSONEncodingTest < Test::Unit::TestCase
|
|
|
79
79
|
json = '["\ud840\udc01"]'
|
|
80
80
|
assert_equal json, generate(utf8, :ascii_only => true)
|
|
81
81
|
assert_equal utf8, parse(json)
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
assert_raise(JSON::ParserError) { parse('"\u"') }
|
|
83
|
+
assert_raise(JSON::ParserError) { parse('"\ud800"') }
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
def test_chars
|
|
@@ -40,6 +40,44 @@ class JSONGeneratorTest < Test::Unit::TestCase
|
|
|
40
40
|
EOT
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
def silence
|
|
44
|
+
v = $VERBOSE
|
|
45
|
+
$VERBOSE = nil
|
|
46
|
+
yield
|
|
47
|
+
ensure
|
|
48
|
+
$VERBOSE = v
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_remove_const_segv
|
|
52
|
+
return if RUBY_ENGINE == 'jruby'
|
|
53
|
+
stress = GC.stress
|
|
54
|
+
const = JSON::SAFE_STATE_PROTOTYPE.dup
|
|
55
|
+
|
|
56
|
+
bignum_too_long_to_embed_as_string = 1234567890123456789012345
|
|
57
|
+
expect = bignum_too_long_to_embed_as_string.to_s
|
|
58
|
+
GC.stress = true
|
|
59
|
+
|
|
60
|
+
10.times do |i|
|
|
61
|
+
tmp = bignum_too_long_to_embed_as_string.to_json
|
|
62
|
+
raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
silence do
|
|
66
|
+
JSON.const_set :SAFE_STATE_PROTOTYPE, nil
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
10.times do |i|
|
|
70
|
+
assert_raise TypeError do
|
|
71
|
+
bignum_too_long_to_embed_as_string.to_json
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
ensure
|
|
75
|
+
GC.stress = stress
|
|
76
|
+
silence do
|
|
77
|
+
JSON.const_set :SAFE_STATE_PROTOTYPE, const
|
|
78
|
+
end
|
|
79
|
+
end if JSON.const_defined?("Ext")
|
|
80
|
+
|
|
43
81
|
def test_generate
|
|
44
82
|
json = generate(@hash)
|
|
45
83
|
assert_equal(parse(@json2), parse(json))
|
|
@@ -374,4 +412,10 @@ EOT
|
|
|
374
412
|
assert_equal '["foo"]', JSON.generate([s.new('foo')])
|
|
375
413
|
end
|
|
376
414
|
end
|
|
415
|
+
|
|
416
|
+
if defined?(Encoding)
|
|
417
|
+
def test_nonutf8_encoding
|
|
418
|
+
assert_equal("\"5\u{b0}\"", "5\xb0".force_encoding("iso-8859-1").to_json)
|
|
419
|
+
end
|
|
420
|
+
end
|
|
377
421
|
end
|
data/tests/json_parser_test.rb
CHANGED
|
@@ -4,6 +4,7 @@ require 'test_helper'
|
|
|
4
4
|
require 'stringio'
|
|
5
5
|
require 'tempfile'
|
|
6
6
|
require 'ostruct'
|
|
7
|
+
require 'bigdecimal'
|
|
7
8
|
|
|
8
9
|
class JSONParserTest < Test::Unit::TestCase
|
|
9
10
|
include JSON
|
|
@@ -90,22 +91,27 @@ class JSONParserTest < Test::Unit::TestCase
|
|
|
90
91
|
assert_raise(JSON::ParserError) { parse('+23') }
|
|
91
92
|
assert_raise(JSON::ParserError) { parse('.23') }
|
|
92
93
|
assert_raise(JSON::ParserError) { parse('023') }
|
|
93
|
-
assert_equal
|
|
94
|
-
assert_equal
|
|
95
|
-
assert_equal_float
|
|
96
|
-
assert_equal_float
|
|
97
|
-
assert_equal_float
|
|
98
|
-
assert_equal_float
|
|
99
|
-
assert_equal_float
|
|
100
|
-
assert_equal_float
|
|
101
|
-
assert_equal_float
|
|
102
|
-
assert_equal_float
|
|
94
|
+
assert_equal(23, parse('23'))
|
|
95
|
+
assert_equal(-23, parse('-23'))
|
|
96
|
+
assert_equal_float(3.141, parse('3.141'))
|
|
97
|
+
assert_equal_float(-3.141, parse('-3.141'))
|
|
98
|
+
assert_equal_float(3.141, parse('3141e-3'))
|
|
99
|
+
assert_equal_float(3.141, parse('3141.1e-3'))
|
|
100
|
+
assert_equal_float(3.141, parse('3141E-3'))
|
|
101
|
+
assert_equal_float(3.141, parse('3141.0E-3'))
|
|
102
|
+
assert_equal_float(-3.141, parse('-3141.0e-3'))
|
|
103
|
+
assert_equal_float(-3.141, parse('-3141e-3'))
|
|
103
104
|
assert_raise(ParserError) { parse('NaN') }
|
|
104
105
|
assert parse('NaN', :allow_nan => true).nan?
|
|
105
106
|
assert_raise(ParserError) { parse('Infinity') }
|
|
106
|
-
assert_equal
|
|
107
|
+
assert_equal(1.0/0, parse('Infinity', :allow_nan => true))
|
|
107
108
|
assert_raise(ParserError) { parse('-Infinity') }
|
|
108
|
-
assert_equal
|
|
109
|
+
assert_equal(-1.0/0, parse('-Infinity', :allow_nan => true))
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_parse_bigdecimals
|
|
113
|
+
assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
|
|
114
|
+
assert_equal(BigDecimal("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] )
|
|
109
115
|
end
|
|
110
116
|
|
|
111
117
|
if Array.method_defined?(:permutation)
|