json-jruby 1.1.3-universal-java-1.6 → 1.1.6-universal-java-1.6
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.
- data/lib/json.rb +0 -2
- data/lib/json/add/core.rb +1 -1
- data/lib/json/ext.rb +2 -0
- data/lib/json/ext/generator.jar +0 -0
- data/lib/json/ext/parser.jar +0 -0
- data/lib/json/pure.rb +2 -0
- data/lib/json/pure/generator.rb +77 -41
- data/lib/json/pure/parser.rb +12 -4
- data/lib/json/version.rb +1 -1
- data/tests/runner.rb +2 -0
- data/tests/test_jjrb_offsets.rb +308 -0
- data/tests/test_json.rb +23 -4
- data/tests/test_json_addition.rb +8 -5
- data/tests/test_json_fixtures.rb +6 -2
- data/tests/test_json_generate.rb +8 -2
- data/tests/test_json_rails.rb +30 -2
- data/tests/test_json_unicode.rb +8 -7
- metadata +9 -11
data/lib/json.rb
CHANGED
data/lib/json/add/core.rb
CHANGED
@@ -96,7 +96,7 @@ class Struct
|
|
96
96
|
|
97
97
|
def to_json(*args)
|
98
98
|
klass = self.class.name
|
99
|
-
klass.empty? and raise JSON::JSONError, "Only named structs are supported!"
|
99
|
+
klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
|
100
100
|
{
|
101
101
|
'json_class' => klass,
|
102
102
|
'v' => values,
|
data/lib/json/ext.rb
CHANGED
data/lib/json/ext/generator.jar
CHANGED
Binary file
|
data/lib/json/ext/parser.jar
CHANGED
Binary file
|
data/lib/json/pure.rb
CHANGED
data/lib/json/pure/generator.rb
CHANGED
@@ -39,23 +39,48 @@ module JSON
|
|
39
39
|
|
40
40
|
# Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with
|
41
41
|
# UTF16 big endian characters as \u????, and return it.
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
42
|
+
if String.method_defined?(:force_encoding)
|
43
|
+
def utf8_to_json(string) # :nodoc:
|
44
|
+
string = string.dup
|
45
|
+
string << '' # XXX workaround: avoid buffer sharing
|
46
|
+
string.force_encoding(Encoding::ASCII_8BIT)
|
47
|
+
string.gsub!(/["\\\/\x0-\x1f]/) { MAP[$&] }
|
48
|
+
string.gsub!(/(
|
49
|
+
(?:
|
50
|
+
[\xc2-\xdf][\x80-\xbf] |
|
51
|
+
[\xe0-\xef][\x80-\xbf]{2} |
|
52
|
+
[\xf0-\xf4][\x80-\xbf]{3}
|
53
|
+
)+ |
|
54
|
+
[\x80-\xc1\xf5-\xff] # invalid
|
55
|
+
)/nx) { |c|
|
56
|
+
c.size == 1 and raise GeneratorError, "invalid utf8 byte: '#{c}'"
|
57
|
+
s = JSON::UTF8toUTF16.iconv(c).unpack('H*')[0]
|
58
|
+
s.gsub!(/.{4}/n, '\\\\u\&')
|
59
|
+
}
|
60
|
+
string.force_encoding(Encoding::UTF_8)
|
61
|
+
string
|
62
|
+
rescue Iconv::Failure => e
|
63
|
+
raise GeneratorError, "Caught #{e.class}: #{e}"
|
64
|
+
end
|
65
|
+
else
|
66
|
+
def utf8_to_json(string) # :nodoc:
|
67
|
+
string = string.gsub(/["\\\/\x0-\x1f]/) { MAP[$&] }
|
68
|
+
string.gsub!(/(
|
69
|
+
(?:
|
70
|
+
[\xc2-\xdf][\x80-\xbf] |
|
71
|
+
[\xe0-\xef][\x80-\xbf]{2} |
|
72
|
+
[\xf0-\xf4][\x80-\xbf]{3}
|
73
|
+
)+ |
|
74
|
+
[\x80-\xc1\xf5-\xff] # invalid
|
75
|
+
)/nx) { |c|
|
76
|
+
c.size == 1 and raise GeneratorError, "invalid utf8 byte: '#{c}'"
|
77
|
+
s = JSON::UTF8toUTF16.iconv(c).unpack('H*')[0]
|
78
|
+
s.gsub!(/.{4}/n, '\\\\u\&')
|
79
|
+
}
|
80
|
+
string
|
81
|
+
rescue Iconv::Failure => e
|
82
|
+
raise GeneratorError, "Caught #{e.class}: #{e}"
|
83
|
+
end
|
59
84
|
end
|
60
85
|
module_function :utf8_to_json
|
61
86
|
|
@@ -239,20 +264,28 @@ module JSON
|
|
239
264
|
|
240
265
|
def json_transform(state, depth)
|
241
266
|
delim = ','
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
267
|
+
if state
|
268
|
+
delim << state.object_nl
|
269
|
+
result = '{'
|
270
|
+
result << state.object_nl
|
271
|
+
result << map { |key,value|
|
272
|
+
s = json_shift(state, depth + 1)
|
273
|
+
s << key.to_s.to_json(state, depth + 1)
|
274
|
+
s << state.space_before
|
275
|
+
s << ':'
|
276
|
+
s << state.space
|
277
|
+
s << value.to_json(state, depth + 1)
|
278
|
+
}.join(delim)
|
279
|
+
result << state.object_nl
|
280
|
+
result << json_shift(state, depth)
|
281
|
+
result << '}'
|
282
|
+
else
|
283
|
+
result = '{'
|
284
|
+
result << map { |key,value|
|
285
|
+
key.to_s.to_json << ':' << value.to_json
|
286
|
+
}.join(delim)
|
287
|
+
result << '}'
|
288
|
+
end
|
256
289
|
result
|
257
290
|
end
|
258
291
|
end
|
@@ -293,16 +326,19 @@ module JSON
|
|
293
326
|
|
294
327
|
def json_transform(state, depth)
|
295
328
|
delim = ','
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
329
|
+
if state
|
330
|
+
delim << state.array_nl
|
331
|
+
result = '['
|
332
|
+
result << state.array_nl
|
333
|
+
result << map { |value|
|
334
|
+
json_shift(state, depth + 1) << value.to_json(state, depth + 1)
|
335
|
+
}.join(delim)
|
336
|
+
result << state.array_nl
|
337
|
+
result << json_shift(state, depth)
|
338
|
+
result << ']'
|
339
|
+
else
|
340
|
+
'[' << map { |value| value.to_json }.join(delim) << ']'
|
341
|
+
end
|
306
342
|
end
|
307
343
|
end
|
308
344
|
|
data/lib/json/pure/parser.rb
CHANGED
@@ -61,6 +61,8 @@ module JSON
|
|
61
61
|
# * *create_additions*: If set to false, the Parser doesn't create
|
62
62
|
# additions even if a matchin class and create_id was found. This option
|
63
63
|
# defaults to true.
|
64
|
+
# * *object_class*: Defaults to Hash
|
65
|
+
# * *array_class*: Defaults to Array
|
64
66
|
def initialize(source, opts = {})
|
65
67
|
super
|
66
68
|
if !opts.key?(:max_nesting) # defaults to 19
|
@@ -74,6 +76,8 @@ module JSON
|
|
74
76
|
ca = true
|
75
77
|
ca = opts[:create_additions] if opts.key?(:create_additions)
|
76
78
|
@create_id = ca ? JSON.create_id : nil
|
79
|
+
@object_class = opts[:object_class] || Hash
|
80
|
+
@array_class = opts[:array_class] || Array
|
77
81
|
end
|
78
82
|
|
79
83
|
alias source string
|
@@ -122,19 +126,23 @@ module JSON
|
|
122
126
|
def parse_string
|
123
127
|
if scan(STRING)
|
124
128
|
return '' if self[1].empty?
|
125
|
-
self[1].gsub(%r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n) do |c|
|
129
|
+
string = self[1].gsub(%r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n) do |c|
|
126
130
|
if u = UNESCAPE_MAP[$&[1]]
|
127
131
|
u
|
128
132
|
else # \uXXXX
|
129
133
|
bytes = ''
|
130
134
|
i = 0
|
131
|
-
while c[6 * i] == ?\\ && c[6 * i + 1] == ?u
|
135
|
+
while c[6 * i] == ?\\ && c[6 * i + 1] == ?u
|
132
136
|
bytes << c[6 * i + 2, 2].to_i(16) << c[6 * i + 4, 2].to_i(16)
|
133
137
|
i += 1
|
134
138
|
end
|
135
139
|
JSON::UTF16toUTF8.iconv(bytes)
|
136
140
|
end
|
137
141
|
end
|
142
|
+
if string.respond_to?(:force_encoding)
|
143
|
+
string.force_encoding(Encoding::UTF_8)
|
144
|
+
end
|
145
|
+
string
|
138
146
|
else
|
139
147
|
UNPARSED
|
140
148
|
end
|
@@ -180,7 +188,7 @@ module JSON
|
|
180
188
|
def parse_array
|
181
189
|
raise NestingError, "nesting of #@current_nesting is to deep" if
|
182
190
|
@max_nesting.nonzero? && @current_nesting > @max_nesting
|
183
|
-
result =
|
191
|
+
result = @array_class.new
|
184
192
|
delim = false
|
185
193
|
until eos?
|
186
194
|
case
|
@@ -212,7 +220,7 @@ module JSON
|
|
212
220
|
def parse_object
|
213
221
|
raise NestingError, "nesting of #@current_nesting is to deep" if
|
214
222
|
@max_nesting.nonzero? && @current_nesting > @max_nesting
|
215
|
-
result =
|
223
|
+
result = @object_class.new
|
216
224
|
delim = false
|
217
225
|
until eos?
|
218
226
|
case
|
data/lib/json/version.rb
CHANGED
data/tests/runner.rb
CHANGED
@@ -10,6 +10,7 @@ require 'test_json_unicode'
|
|
10
10
|
require 'test_json_addition'
|
11
11
|
require 'test_json_rails'
|
12
12
|
require 'test_json_fixtures'
|
13
|
+
require 'test_jjrb_offsets'
|
13
14
|
|
14
15
|
class TS_AllTests
|
15
16
|
def self.suite
|
@@ -20,6 +21,7 @@ class TS_AllTests
|
|
20
21
|
suite << TC_JSONAddition.suite
|
21
22
|
suite << TC_JSONRails.suite
|
22
23
|
suite << TC_JSONFixtures.suite
|
24
|
+
suite << TestJjrbOffsets.suite
|
23
25
|
end
|
24
26
|
end
|
25
27
|
Test::Unit::UI::Console::TestRunner.run(TS_AllTests)
|
@@ -0,0 +1,308 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
case ENV['JSON']
|
6
|
+
when 'pure' then require 'json/pure'
|
7
|
+
when 'ext' then require 'json/ext'
|
8
|
+
else require 'json'
|
9
|
+
end
|
10
|
+
|
11
|
+
class TestJjrbOffsets < Test::Unit::TestCase
|
12
|
+
# Test non-zero ByteList offsets.
|
13
|
+
# Yes, this is a very ad-hoc, copy-pasted test suite.
|
14
|
+
|
15
|
+
include JSON
|
16
|
+
|
17
|
+
def o(string, offset = 1)
|
18
|
+
full = "!" * offset + string
|
19
|
+
return full[offset, string.length]
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse(string, *args)
|
23
|
+
return JSON.parse(o(string), *args)
|
24
|
+
end
|
25
|
+
|
26
|
+
def setup
|
27
|
+
@ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
|
28
|
+
|x| [x]
|
29
|
+
end
|
30
|
+
@ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
|
31
|
+
"[1,-2,3]", "false", "true"].map do
|
32
|
+
|x| "[#{x}]"
|
33
|
+
end
|
34
|
+
@hash = {
|
35
|
+
'a' => 2,
|
36
|
+
'b' => 3.141,
|
37
|
+
'c' => 'c',
|
38
|
+
'd' => [ 1, "b", 3.14 ],
|
39
|
+
'e' => { 'foo' => 'bar' },
|
40
|
+
'g' => "\"\0\037",
|
41
|
+
'h' => 1000.0,
|
42
|
+
'i' => 0.001
|
43
|
+
}
|
44
|
+
@json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
|
45
|
+
'"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_parser_source_offset
|
49
|
+
parser = JSON::Parser.new(o("test"))
|
50
|
+
assert_equal 'test', parser.source
|
51
|
+
assert_equal [], parse("[]")
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_equal_float(expected, is)
|
55
|
+
assert_in_delta(expected.first, is.first, 1e-2)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_parse_simple_arrays
|
59
|
+
assert_equal([], parse('[]'))
|
60
|
+
assert_equal([], parse(' [ ] '))
|
61
|
+
assert_equal([nil], parse('[null]'))
|
62
|
+
assert_equal([false], parse('[false]'))
|
63
|
+
assert_equal([true], parse('[true]'))
|
64
|
+
assert_equal([-23], parse('[-23]'))
|
65
|
+
assert_equal([23], parse('[23]'))
|
66
|
+
assert_equal([0.23], parse('[0.23]'))
|
67
|
+
assert_equal([0.0], parse('[0e0]'))
|
68
|
+
assert_raises(JSON::ParserError) { parse('[+23.2]') }
|
69
|
+
assert_raises(JSON::ParserError) { parse('[+23]') }
|
70
|
+
assert_raises(JSON::ParserError) { parse('[.23]') }
|
71
|
+
assert_raises(JSON::ParserError) { parse('[023]') }
|
72
|
+
assert_equal_float [3.141], parse('[3.141]')
|
73
|
+
assert_equal_float [-3.141], parse('[-3.141]')
|
74
|
+
assert_equal_float [3.141], parse('[3141e-3]')
|
75
|
+
assert_equal_float [3.141], parse('[3141.1e-3]')
|
76
|
+
assert_equal_float [3.141], parse('[3141E-3]')
|
77
|
+
assert_equal_float [3.141], parse('[3141.0E-3]')
|
78
|
+
assert_equal_float [-3.141], parse('[-3141.0e-3]')
|
79
|
+
assert_equal_float [-3.141], parse('[-3141e-3]')
|
80
|
+
assert_raises(ParserError) { parse('[NaN]') }
|
81
|
+
assert parse('[NaN]', :allow_nan => true).first.nan?
|
82
|
+
assert_raises(ParserError) { parse('[Infinity]') }
|
83
|
+
assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
|
84
|
+
assert_raises(ParserError) { parse('[-Infinity]') }
|
85
|
+
assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
|
86
|
+
assert_equal([""], parse('[""]'))
|
87
|
+
assert_equal(["foobar"], parse('["foobar"]'))
|
88
|
+
assert_equal([{}], parse('[{}]'))
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_parse_simple_objects
|
92
|
+
assert_equal({}, parse('{}'))
|
93
|
+
assert_equal({}, parse(' { } '))
|
94
|
+
assert_equal({ "a" => nil }, parse('{ "a" : null}'))
|
95
|
+
assert_equal({ "a" => nil }, parse('{"a":null}'))
|
96
|
+
assert_equal({ "a" => false }, parse('{ "a" : false } '))
|
97
|
+
assert_equal({ "a" => false }, parse('{"a":false}'))
|
98
|
+
assert_raises(JSON::ParserError) { parse('{false}') }
|
99
|
+
assert_equal({ "a" => true }, parse('{"a":true}'))
|
100
|
+
assert_equal({ "a" => true }, parse(' { "a" : true } '))
|
101
|
+
assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
|
102
|
+
assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
|
103
|
+
assert_equal({ "a" => 23 }, parse('{"a":23 } '))
|
104
|
+
assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
|
105
|
+
assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
|
106
|
+
assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
|
107
|
+
end
|
108
|
+
|
109
|
+
begin
|
110
|
+
require 'permutation'
|
111
|
+
def test_parse_more_complex_arrays
|
112
|
+
a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
|
113
|
+
perms = Permutation.for a
|
114
|
+
perms.each do |perm|
|
115
|
+
orig_ary = perm.project
|
116
|
+
json = pretty_generate(orig_ary)
|
117
|
+
assert_equal orig_ary, parse(json)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_parse_complex_objects
|
122
|
+
a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
|
123
|
+
perms = Permutation.for a
|
124
|
+
perms.each do |perm|
|
125
|
+
s = "a"
|
126
|
+
orig_obj = perm.project.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
|
127
|
+
json = pretty_generate(orig_obj)
|
128
|
+
assert_equal orig_obj, parse(json)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
rescue LoadError
|
132
|
+
warn "Skipping permutation tests."
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_parse_arrays
|
136
|
+
assert_equal([1,2,3], parse('[1,2,3]'))
|
137
|
+
assert_equal([1.2,2,3], parse('[1.2,2,3]'))
|
138
|
+
assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_parse_values
|
142
|
+
assert_equal([""], parse('[""]'))
|
143
|
+
assert_equal(["\\"], parse('["\\\\"]'))
|
144
|
+
assert_equal(['"'], parse('["\""]'))
|
145
|
+
assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
|
146
|
+
assert_equal(["\"\b\n\r\t\0\037"],
|
147
|
+
parse('["\"\b\n\r\t\u0000\u001f"]'))
|
148
|
+
for i in 0 ... @ary.size
|
149
|
+
assert_equal(@ary[i], parse(@ary_to_parse[i]))
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_parse_array
|
154
|
+
assert_equal([], parse('[]'))
|
155
|
+
assert_equal([], parse(' [ ] '))
|
156
|
+
assert_equal([1], parse('[1]'))
|
157
|
+
assert_equal([1], parse(' [ 1 ] '))
|
158
|
+
assert_equal(@ary,
|
159
|
+
parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
|
160
|
+
',[false],[true]]'))
|
161
|
+
assert_equal(@ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]
|
162
|
+
, [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_parse_object
|
166
|
+
assert_equal({}, parse('{}'))
|
167
|
+
assert_equal({}, parse(' { } '))
|
168
|
+
assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
|
169
|
+
assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_parser_reset
|
173
|
+
parser = Parser.new(@json)
|
174
|
+
assert_equal(@hash, parser.parse)
|
175
|
+
assert_equal(@hash, parser.parse)
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_comments
|
179
|
+
json = <<EOT
|
180
|
+
{
|
181
|
+
"key1":"value1", // eol comment
|
182
|
+
"key2":"value2" /* multi line
|
183
|
+
* comment */,
|
184
|
+
"key3":"value3" /* multi line
|
185
|
+
// nested eol comment
|
186
|
+
* comment */
|
187
|
+
}
|
188
|
+
EOT
|
189
|
+
assert_equal(
|
190
|
+
{ "key1" => "value1", "key2" => "value2", "key3" => "value3" },
|
191
|
+
parse(json))
|
192
|
+
json = <<EOT
|
193
|
+
{
|
194
|
+
"key1":"value1" /* multi line
|
195
|
+
// nested eol comment
|
196
|
+
/* illegal nested multi line comment */
|
197
|
+
* comment */
|
198
|
+
}
|
199
|
+
EOT
|
200
|
+
assert_raises(ParserError) { parse(json) }
|
201
|
+
json = <<EOT
|
202
|
+
{
|
203
|
+
"key1":"value1" /* multi line
|
204
|
+
// nested eol comment
|
205
|
+
closed multi comment */
|
206
|
+
and again, throw an Error */
|
207
|
+
}
|
208
|
+
EOT
|
209
|
+
assert_raises(ParserError) { parse(json) }
|
210
|
+
json = <<EOT
|
211
|
+
{
|
212
|
+
"key1":"value1" /*/*/
|
213
|
+
}
|
214
|
+
EOT
|
215
|
+
assert_equal({ "key1" => "value1" }, parse(json))
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_backslash
|
219
|
+
data = [ '\\.(?i:gif|jpe?g|png)$' ]
|
220
|
+
json = '["\\\\.(?i:gif|jpe?g|png)$"]'
|
221
|
+
assert_equal json, JSON.unparse(data)
|
222
|
+
assert_equal data, JSON.parse(json)
|
223
|
+
#
|
224
|
+
data = [ '\\"' ]
|
225
|
+
json = '["\\\\\""]'
|
226
|
+
assert_equal json, JSON.unparse(data)
|
227
|
+
assert_equal data, JSON.parse(json)
|
228
|
+
#
|
229
|
+
json = '["\/"]'
|
230
|
+
data = JSON.parse(json)
|
231
|
+
assert_equal ['/'], data
|
232
|
+
assert_equal json, JSON.unparse(data)
|
233
|
+
#
|
234
|
+
json = '["\""]'
|
235
|
+
data = JSON.parse(json)
|
236
|
+
assert_equal ['"'], data
|
237
|
+
assert_equal json, JSON.unparse(data)
|
238
|
+
json = '["\\\'"]'
|
239
|
+
data = JSON.parse(json)
|
240
|
+
assert_equal ["'"], data
|
241
|
+
assert_equal '["\'"]', JSON.unparse(data)
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_wrong_inputs
|
245
|
+
assert_raises(ParserError) { JSON.parse('"foo"') }
|
246
|
+
assert_raises(ParserError) { JSON.parse('123') }
|
247
|
+
assert_raises(ParserError) { JSON.parse('[] bla') }
|
248
|
+
assert_raises(ParserError) { JSON.parse('[] 1') }
|
249
|
+
assert_raises(ParserError) { JSON.parse('[] []') }
|
250
|
+
assert_raises(ParserError) { JSON.parse('[] {}') }
|
251
|
+
assert_raises(ParserError) { JSON.parse('{} []') }
|
252
|
+
assert_raises(ParserError) { JSON.parse('{} {}') }
|
253
|
+
assert_raises(ParserError) { JSON.parse('[NULL]') }
|
254
|
+
assert_raises(ParserError) { JSON.parse('[FALSE]') }
|
255
|
+
assert_raises(ParserError) { JSON.parse('[TRUE]') }
|
256
|
+
assert_raises(ParserError) { JSON.parse('[07] ') }
|
257
|
+
assert_raises(ParserError) { JSON.parse('[0a]') }
|
258
|
+
assert_raises(ParserError) { JSON.parse('[1.]') }
|
259
|
+
assert_raises(ParserError) { JSON.parse(' ') }
|
260
|
+
end
|
261
|
+
|
262
|
+
def test_nesting
|
263
|
+
assert_raises(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
|
264
|
+
assert_raises(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
|
265
|
+
assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
|
266
|
+
too_deep = '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]'
|
267
|
+
too_deep_ary = eval too_deep
|
268
|
+
assert_raises(JSON::NestingError) { JSON.parse too_deep }
|
269
|
+
assert_raises(JSON::NestingError) { JSON.parser.new(too_deep).parse }
|
270
|
+
assert_raises(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 19 }
|
271
|
+
ok = JSON.parse too_deep, :max_nesting => 20
|
272
|
+
assert_equal too_deep_ary, ok
|
273
|
+
ok = JSON.parse too_deep, :max_nesting => nil
|
274
|
+
assert_equal too_deep_ary, ok
|
275
|
+
ok = JSON.parse too_deep, :max_nesting => false
|
276
|
+
assert_equal too_deep_ary, ok
|
277
|
+
ok = JSON.parse too_deep, :max_nesting => 0
|
278
|
+
assert_equal too_deep_ary, ok
|
279
|
+
assert_raises(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
|
280
|
+
assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
|
281
|
+
assert_raises(JSON::NestingError) { JSON.generate too_deep_ary }
|
282
|
+
assert_raises(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 19 }
|
283
|
+
ok = JSON.generate too_deep_ary, :max_nesting => 20
|
284
|
+
assert_equal too_deep, ok
|
285
|
+
ok = JSON.generate too_deep_ary, :max_nesting => nil
|
286
|
+
assert_equal too_deep, ok
|
287
|
+
ok = JSON.generate too_deep_ary, :max_nesting => false
|
288
|
+
assert_equal too_deep, ok
|
289
|
+
ok = JSON.generate too_deep_ary, :max_nesting => 0
|
290
|
+
assert_equal too_deep, ok
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_load_dump
|
294
|
+
too_deep = '[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]'
|
295
|
+
assert_equal too_deep, JSON.dump(eval(too_deep))
|
296
|
+
assert_kind_of String, Marshal.dump(eval(too_deep))
|
297
|
+
assert_raises(ArgumentError) { JSON.dump(eval(too_deep), 19) }
|
298
|
+
assert_raises(ArgumentError) { Marshal.dump(eval(too_deep), 19) }
|
299
|
+
assert_equal too_deep, JSON.dump(eval(too_deep), 20)
|
300
|
+
assert_kind_of String, Marshal.dump(eval(too_deep), 20)
|
301
|
+
output = StringIO.new
|
302
|
+
JSON.dump(eval(too_deep), output)
|
303
|
+
assert_equal too_deep, output.string
|
304
|
+
output = StringIO.new
|
305
|
+
JSON.dump(eval(too_deep), output, 20)
|
306
|
+
assert_equal too_deep, output.string
|
307
|
+
end
|
308
|
+
end
|
data/tests/test_json.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
|
3
4
|
require 'test/unit'
|
4
|
-
|
5
|
+
case ENV['JSON']
|
6
|
+
when 'pure' then require 'json/pure'
|
7
|
+
when 'ext' then require 'json/ext'
|
8
|
+
else require 'json'
|
9
|
+
end
|
5
10
|
require 'stringio'
|
6
11
|
|
7
12
|
class TC_JSON < Test::Unit::TestCase
|
8
13
|
include JSON
|
9
14
|
|
10
15
|
def setup
|
11
|
-
$KCODE = 'UTF8'
|
12
16
|
@ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
|
13
17
|
|x| [x]
|
14
18
|
end
|
@@ -26,10 +30,9 @@ class TC_JSON < Test::Unit::TestCase
|
|
26
30
|
'h' => 1000.0,
|
27
31
|
'i' => 0.001
|
28
32
|
}
|
29
|
-
@json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'
|
33
|
+
@json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
|
30
34
|
'"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
|
31
35
|
end
|
32
|
-
suite << TC_JSON.suite
|
33
36
|
|
34
37
|
def test_construction
|
35
38
|
parser = JSON::Parser.new('test')
|
@@ -147,6 +150,14 @@ class TC_JSON < Test::Unit::TestCase
|
|
147
150
|
, [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
|
148
151
|
end
|
149
152
|
|
153
|
+
class SubArray < Array; end
|
154
|
+
|
155
|
+
def test_parse_array_custom_class
|
156
|
+
res = parse('[]', :array_class => SubArray)
|
157
|
+
assert_equal([], res)
|
158
|
+
assert_equal(SubArray, res.class)
|
159
|
+
end
|
160
|
+
|
150
161
|
def test_parse_object
|
151
162
|
assert_equal({}, parse('{}'))
|
152
163
|
assert_equal({}, parse(' { } '))
|
@@ -154,6 +165,14 @@ class TC_JSON < Test::Unit::TestCase
|
|
154
165
|
assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
|
155
166
|
end
|
156
167
|
|
168
|
+
class SubHash < Hash; end
|
169
|
+
|
170
|
+
def test_parse_object_custom_class
|
171
|
+
res = parse('{}', :object_class => SubHash)
|
172
|
+
assert_equal({}, res)
|
173
|
+
assert_equal(SubHash, res.class)
|
174
|
+
end
|
175
|
+
|
157
176
|
def test_parser_reset
|
158
177
|
parser = Parser.new(@json)
|
159
178
|
assert_equal(@hash, parser.parse)
|
data/tests/test_json_addition.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding:utf-8 -*-
|
2
3
|
|
3
4
|
require 'test/unit'
|
5
|
+
case ENV['JSON']
|
6
|
+
when 'pure' then require 'json/pure'
|
7
|
+
when 'ext' then require 'json/ext'
|
8
|
+
else require 'json'
|
9
|
+
end
|
4
10
|
require 'json/add/core'
|
5
11
|
require 'date'
|
6
12
|
|
@@ -54,10 +60,6 @@ class TC_JSONAddition < Test::Unit::TestCase
|
|
54
60
|
end
|
55
61
|
end
|
56
62
|
|
57
|
-
def setup
|
58
|
-
$KCODE = 'UTF8'
|
59
|
-
end
|
60
|
-
|
61
63
|
def test_extended_json
|
62
64
|
a = A.new(666)
|
63
65
|
assert A.json_creatable?
|
@@ -98,6 +100,7 @@ class TC_JSONAddition < Test::Unit::TestCase
|
|
98
100
|
|
99
101
|
def test_raw_strings
|
100
102
|
raw = ''
|
103
|
+
raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
|
101
104
|
raw_array = []
|
102
105
|
for i in 0..255
|
103
106
|
raw << i
|
@@ -120,7 +123,7 @@ EOT
|
|
120
123
|
|
121
124
|
def test_core
|
122
125
|
t = Time.now
|
123
|
-
assert_equal t, JSON(JSON(t))
|
126
|
+
assert_equal t.inspect, JSON(JSON(t)).inspect
|
124
127
|
d = Date.today
|
125
128
|
assert_equal d, JSON(JSON(d))
|
126
129
|
d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
|
data/tests/test_json_fixtures.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
|
3
4
|
require 'test/unit'
|
4
|
-
|
5
|
+
case ENV['JSON']
|
6
|
+
when 'pure' then require 'json/pure'
|
7
|
+
when 'ext' then require 'json/ext'
|
8
|
+
else require 'json'
|
9
|
+
end
|
5
10
|
|
6
11
|
class TC_JSONFixtures < Test::Unit::TestCase
|
7
12
|
def setup
|
8
|
-
$KCODE = 'UTF8'
|
9
13
|
fixtures = File.join(File.dirname(__FILE__), 'fixtures/*.json')
|
10
14
|
passed, failed = Dir[fixtures].partition { |f| f['pass'] }
|
11
15
|
@passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
|
data/tests/test_json_generate.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
1
4
|
require 'test/unit'
|
2
|
-
|
5
|
+
case ENV['JSON']
|
6
|
+
when 'pure' then require 'json/pure'
|
7
|
+
when 'ext' then require 'json/ext'
|
8
|
+
else require 'json'
|
9
|
+
end
|
3
10
|
|
4
11
|
class TC_JSONGenerate < Test::Unit::TestCase
|
5
12
|
include JSON
|
6
13
|
|
7
14
|
def setup
|
8
|
-
$KCODE = 'UTF8'
|
9
15
|
@hash = {
|
10
16
|
'a' => 2,
|
11
17
|
'b' => 3.141,
|
data/tests/test_json_rails.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
|
3
4
|
require 'test/unit'
|
5
|
+
case ENV['JSON']
|
6
|
+
when 'pure' then require 'json/pure'
|
7
|
+
when 'ext' then require 'json/ext'
|
8
|
+
else require 'json'
|
9
|
+
end
|
4
10
|
require 'json/add/rails'
|
5
11
|
require 'date'
|
6
12
|
|
@@ -50,17 +56,38 @@ class TC_JSONRails < Test::Unit::TestCase
|
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
53
|
-
|
54
|
-
|
59
|
+
class D
|
60
|
+
def initialize
|
61
|
+
@foo = 666
|
62
|
+
end
|
63
|
+
|
64
|
+
attr_reader :foo
|
65
|
+
|
66
|
+
def ==(other)
|
67
|
+
foo == other.foo
|
68
|
+
end
|
55
69
|
end
|
56
70
|
|
57
71
|
def test_extended_json
|
58
72
|
a = A.new(666)
|
59
73
|
assert A.json_creatable?
|
74
|
+
assert_equal 666, a.a
|
60
75
|
json = generate(a)
|
61
76
|
a_again = JSON.parse(json)
|
62
77
|
assert_kind_of a.class, a_again
|
63
78
|
assert_equal a, a_again
|
79
|
+
assert_equal 666, a_again.a
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_extended_json_generic_object
|
83
|
+
d = D.new
|
84
|
+
assert D.json_creatable?
|
85
|
+
assert_equal 666, d.foo
|
86
|
+
json = generate(d)
|
87
|
+
d_again = JSON.parse(json)
|
88
|
+
assert_kind_of d.class, d_again
|
89
|
+
assert_equal d, d_again
|
90
|
+
assert_equal 666, d_again.foo
|
64
91
|
end
|
65
92
|
|
66
93
|
def test_extended_json_disabled
|
@@ -94,6 +121,7 @@ class TC_JSONRails < Test::Unit::TestCase
|
|
94
121
|
|
95
122
|
def test_raw_strings
|
96
123
|
raw = ''
|
124
|
+
raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
|
97
125
|
raw_array = []
|
98
126
|
for i in 0..255
|
99
127
|
raw << i
|
data/tests/test_json_unicode.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
|
3
4
|
require 'test/unit'
|
4
|
-
|
5
|
+
case ENV['JSON']
|
6
|
+
when 'pure' then require 'json/pure'
|
7
|
+
when 'ext' then require 'json/ext'
|
8
|
+
else require 'json'
|
9
|
+
end
|
5
10
|
|
6
11
|
class TC_JSONUnicode < Test::Unit::TestCase
|
7
12
|
include JSON
|
8
13
|
|
9
|
-
def setup
|
10
|
-
$KCODE = 'UTF8'
|
11
|
-
end
|
12
|
-
|
13
14
|
def test_unicode
|
14
15
|
assert_equal '""', ''.to_json
|
15
16
|
assert_equal '"\\b"', "\b".to_json
|
@@ -53,8 +54,8 @@ class TC_JSONUnicode < Test::Unit::TestCase
|
|
53
54
|
assert_equal json, JSON.generate(["" << i])
|
54
55
|
end
|
55
56
|
end
|
56
|
-
|
57
|
-
JSON.generate([""
|
57
|
+
assert_raise(JSON::GeneratorError) do
|
58
|
+
JSON.generate(["\x80"])
|
58
59
|
end
|
59
60
|
assert_equal "\302\200", JSON.parse('["\u0080"]').first
|
60
61
|
end
|
metadata
CHANGED
@@ -17,23 +17,21 @@ signing_key:
|
|
17
17
|
name: json-jruby
|
18
18
|
rdoc_options: []
|
19
19
|
|
20
|
-
autorequire:
|
21
20
|
rubyforge_project: json-jruby
|
21
|
+
autorequire:
|
22
|
+
licenses: []
|
23
|
+
|
22
24
|
executables: []
|
23
25
|
|
24
26
|
description:
|
25
|
-
specification_version:
|
27
|
+
specification_version: 3
|
26
28
|
default_executable:
|
27
29
|
files:
|
28
30
|
- lib/json.rb
|
29
|
-
- lib/json
|
30
31
|
- lib/json/version.rb
|
31
|
-
- lib/json/add
|
32
|
-
- lib/json/ext
|
33
32
|
- lib/json/ext.rb
|
34
33
|
- lib/json/pure.rb
|
35
34
|
- lib/json/common.rb
|
36
|
-
- lib/json/pure
|
37
35
|
- lib/json/add/rails.rb
|
38
36
|
- lib/json/add/core.rb
|
39
37
|
- lib/json/ext/generator.jar
|
@@ -42,7 +40,7 @@ files:
|
|
42
40
|
- lib/json/pure/parser.rb
|
43
41
|
- tests/test_json_generate.rb
|
44
42
|
- tests/test_json_unicode.rb
|
45
|
-
- tests/
|
43
|
+
- tests/test_jjrb_offsets.rb
|
46
44
|
- tests/test_json_addition.rb
|
47
45
|
- tests/test_json_fixtures.rb
|
48
46
|
- tests/test_json_rails.rb
|
@@ -87,20 +85,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
85
|
version:
|
88
86
|
extensions: []
|
89
87
|
|
90
|
-
rubygems_version: 1.3.
|
88
|
+
rubygems_version: 1.3.3
|
91
89
|
requirements: []
|
92
90
|
|
93
91
|
authors:
|
94
92
|
- Daniel Luz
|
95
|
-
date: 2009-
|
93
|
+
date: 2009-05-13 03:00:00 +00:00
|
96
94
|
platform: universal-java-1.6
|
97
95
|
test_files:
|
98
96
|
- tests/runner.rb
|
99
97
|
version: !ruby/object:Gem::Version
|
100
|
-
version: 1.1.
|
98
|
+
version: 1.1.6
|
101
99
|
require_paths:
|
102
100
|
- lib
|
103
101
|
dependencies: []
|
104
102
|
|
105
103
|
bindir: bin
|
106
|
-
has_rdoc:
|
104
|
+
has_rdoc: true
|