json 2.6.3-java → 2.7.0-java
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/lib/json/add/bigdecimal.rb +5 -2
- data/lib/json/add/range.rb +22 -7
- data/lib/json/common.rb +11 -27
- data/lib/json/ext/generator.jar +0 -0
- data/lib/json/ext/parser.jar +0 -0
- data/lib/json/pure/generator.rb +62 -28
- data/lib/json/version.rb +1 -1
- data/lib/json.rb +9 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0639594dab0feed046795b7c60d02e6c0daa3a889062bf606a7ed74622fbb1d9'
|
4
|
+
data.tar.gz: 84a8f40d420965476fdd0176a602aef081b7c24e3826e85d4fbbdb369ba911cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9606d288938838d86c09a888d713c5cace3f6af9a2f1ebf17d38a1102a25f01989fd8a3656b429ecc631704971dbff7c75f9582e4a47f879198e550d750ace4
|
7
|
+
data.tar.gz: b7252f8086e499779ad41edea561c3f039065cafd6e45358de3a037056168a6c372d971903a30db83c1e82a3dbb2dce354b085f1b381114a4cc0db20aa549f9e
|
data/lib/json/add/bigdecimal.rb
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
|
3
3
|
require 'json'
|
4
4
|
end
|
5
|
-
|
5
|
+
begin
|
6
|
+
require 'bigdecimal'
|
7
|
+
rescue LoadError
|
8
|
+
end
|
6
9
|
|
7
10
|
class BigDecimal
|
8
11
|
# Import a JSON Marshalled object.
|
@@ -26,4 +29,4 @@ class BigDecimal
|
|
26
29
|
def to_json(*args)
|
27
30
|
as_json.to_json(*args)
|
28
31
|
end
|
29
|
-
end
|
32
|
+
end if defined?(::BigDecimal)
|
data/lib/json/add/range.rb
CHANGED
@@ -5,14 +5,25 @@ end
|
|
5
5
|
|
6
6
|
class Range
|
7
7
|
|
8
|
-
#
|
9
|
-
#
|
8
|
+
# Returns a new \Range object constructed from <tt>object['a']</tt>,
|
9
|
+
# which must be an array of values suitable for a call to Range.new:
|
10
|
+
#
|
11
|
+
# require 'json/add/range'
|
12
|
+
# Range.json_create({"a"=>[1, 4]}) # => 1..4
|
13
|
+
# Range.json_create({"a"=>[1, 4, true]}) # => 1...4
|
14
|
+
# Range.json_create({"a" => ['a', 'd']}) # => "a".."d"
|
15
|
+
#
|
10
16
|
def self.json_create(object)
|
11
17
|
new(*object['a'])
|
12
18
|
end
|
13
19
|
|
14
|
-
# Returns a hash
|
15
|
-
#
|
20
|
+
# Returns a 2-element hash representing +self+:
|
21
|
+
#
|
22
|
+
# require 'json/add/range'
|
23
|
+
# (1..4).as_json # => {"json_class"=>"Range", "a"=>[1, 4, false]}
|
24
|
+
# (1...4).as_json # => {"json_class"=>"Range", "a"=>[1, 4, true]}
|
25
|
+
# ('a'..'d').as_json # => {"json_class"=>"Range", "a"=>["a", "d", false]}
|
26
|
+
#
|
16
27
|
def as_json(*)
|
17
28
|
{
|
18
29
|
JSON.create_id => self.class.name,
|
@@ -20,9 +31,13 @@ class Range
|
|
20
31
|
}
|
21
32
|
end
|
22
33
|
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
34
|
+
# Returns a JSON string representing +self+:
|
35
|
+
#
|
36
|
+
# require 'json/add/range'
|
37
|
+
# (1..4).to_json # => "{\"json_class\":\"Range\",\"a\":[1,4,false]}"
|
38
|
+
# (1...4).to_json # => "{\"json_class\":\"Range\",\"a\":[1,4,true]}"
|
39
|
+
# ('a'..'d').to_json # => "{\"json_class\":\"Range\",\"a\":[\"a\",\"d\",false]}"
|
40
|
+
#
|
26
41
|
def to_json(*args)
|
27
42
|
as_json.to_json(*args)
|
28
43
|
end
|
data/lib/json/common.rb
CHANGED
@@ -3,6 +3,9 @@ require 'json/version'
|
|
3
3
|
require 'json/generic_object'
|
4
4
|
|
5
5
|
module JSON
|
6
|
+
NOT_SET = Object.new.freeze
|
7
|
+
private_constant :NOT_SET
|
8
|
+
|
6
9
|
class << self
|
7
10
|
# :call-seq:
|
8
11
|
# JSON[object] -> new_array or new_string
|
@@ -295,19 +298,9 @@ module JSON
|
|
295
298
|
#
|
296
299
|
def generate(obj, opts = nil)
|
297
300
|
if State === opts
|
298
|
-
state
|
301
|
+
state = opts
|
299
302
|
else
|
300
|
-
state = State.new
|
301
|
-
end
|
302
|
-
if opts
|
303
|
-
if opts.respond_to? :to_hash
|
304
|
-
opts = opts.to_hash
|
305
|
-
elsif opts.respond_to? :to_h
|
306
|
-
opts = opts.to_h
|
307
|
-
else
|
308
|
-
raise TypeError, "can't convert #{opts.class} into Hash"
|
309
|
-
end
|
310
|
-
state = state.configure(opts)
|
303
|
+
state = State.new(opts)
|
311
304
|
end
|
312
305
|
state.generate(obj)
|
313
306
|
end
|
@@ -334,19 +327,9 @@ module JSON
|
|
334
327
|
# JSON.fast_generate(a)
|
335
328
|
def fast_generate(obj, opts = nil)
|
336
329
|
if State === opts
|
337
|
-
state
|
330
|
+
state = opts
|
338
331
|
else
|
339
|
-
state = JSON.create_fast_state
|
340
|
-
end
|
341
|
-
if opts
|
342
|
-
if opts.respond_to? :to_hash
|
343
|
-
opts = opts.to_hash
|
344
|
-
elsif opts.respond_to? :to_h
|
345
|
-
opts = opts.to_h
|
346
|
-
else
|
347
|
-
raise TypeError, "can't convert #{opts.class} into Hash"
|
348
|
-
end
|
349
|
-
state.configure(opts)
|
332
|
+
state = JSON.create_fast_state.configure(opts)
|
350
333
|
end
|
351
334
|
state.generate(obj)
|
352
335
|
end
|
@@ -592,13 +575,13 @@ module JSON
|
|
592
575
|
# Sets or returns the default options for the JSON.dump method.
|
593
576
|
# Initially:
|
594
577
|
# opts = JSON.dump_default_options
|
595
|
-
# opts # => {:max_nesting=>false, :allow_nan=>true, :
|
578
|
+
# opts # => {:max_nesting=>false, :allow_nan=>true, :script_safe=>false}
|
596
579
|
attr_accessor :dump_default_options
|
597
580
|
end
|
598
581
|
self.dump_default_options = {
|
599
582
|
:max_nesting => false,
|
600
583
|
:allow_nan => true,
|
601
|
-
:
|
584
|
+
:script_safe => false,
|
602
585
|
}
|
603
586
|
|
604
587
|
# :call-seq:
|
@@ -628,7 +611,7 @@ module JSON
|
|
628
611
|
# puts File.read(path)
|
629
612
|
# Output:
|
630
613
|
# {"foo":[0,1],"bar":{"baz":2,"bat":3},"bam":"bad"}
|
631
|
-
def dump(obj, anIO = nil, limit = nil)
|
614
|
+
def dump(obj, anIO = nil, limit = nil, strict: NOT_SET)
|
632
615
|
if anIO and limit.nil?
|
633
616
|
anIO = anIO.to_io if anIO.respond_to?(:to_io)
|
634
617
|
unless anIO.respond_to?(:write)
|
@@ -638,6 +621,7 @@ module JSON
|
|
638
621
|
end
|
639
622
|
opts = JSON.dump_default_options
|
640
623
|
opts = opts.merge(:max_nesting => limit) if limit
|
624
|
+
opts[:strict] = strict if NOT_SET != strict
|
641
625
|
result = generate(obj, opts)
|
642
626
|
if anIO
|
643
627
|
anIO.write result
|
Binary file
|
Binary file
|
data/lib/json/pure/generator.rb
CHANGED
@@ -37,25 +37,34 @@ module JSON
|
|
37
37
|
'\\' => '\\\\',
|
38
38
|
} # :nodoc:
|
39
39
|
|
40
|
-
|
40
|
+
ESCAPE_PATTERN = /[\/"\\\x0-\x1f]/n # :nodoc:
|
41
|
+
|
42
|
+
SCRIPT_SAFE_MAP = MAP.merge(
|
41
43
|
'/' => '\\/',
|
44
|
+
"\u2028".b => '\u2028',
|
45
|
+
"\u2029".b => '\u2029',
|
42
46
|
)
|
43
47
|
|
48
|
+
SCRIPT_SAFE_ESCAPE_PATTERN = Regexp.union(ESCAPE_PATTERN, "\u2028".b, "\u2029".b)
|
49
|
+
|
44
50
|
# Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with
|
45
51
|
# UTF16 big endian characters as \u????, and return it.
|
46
|
-
def utf8_to_json(string,
|
52
|
+
def utf8_to_json(string, script_safe = false) # :nodoc:
|
47
53
|
string = string.dup
|
48
54
|
string.force_encoding(::Encoding::ASCII_8BIT)
|
49
|
-
|
50
|
-
|
55
|
+
if script_safe
|
56
|
+
string.gsub!(SCRIPT_SAFE_ESCAPE_PATTERN) { SCRIPT_SAFE_MAP[$&] || $& }
|
57
|
+
else
|
58
|
+
string.gsub!(ESCAPE_PATTERN) { MAP[$&] || $& }
|
59
|
+
end
|
51
60
|
string.force_encoding(::Encoding::UTF_8)
|
52
61
|
string
|
53
62
|
end
|
54
63
|
|
55
|
-
def utf8_to_json_ascii(string,
|
64
|
+
def utf8_to_json_ascii(string, script_safe = false) # :nodoc:
|
56
65
|
string = string.dup
|
57
66
|
string.force_encoding(::Encoding::ASCII_8BIT)
|
58
|
-
map =
|
67
|
+
map = script_safe ? SCRIPT_SAFE_MAP : MAP
|
59
68
|
string.gsub!(/[\/"\\\x0-\x1f]/n) { map[$&] || $& }
|
60
69
|
string.gsub!(/(
|
61
70
|
(?:
|
@@ -115,7 +124,8 @@ module JSON
|
|
115
124
|
# * *space_before*: a string that is put before a : pair delimiter (default: ''),
|
116
125
|
# * *object_nl*: a string that is put at the end of a JSON object (default: ''),
|
117
126
|
# * *array_nl*: a string that is put at the end of a JSON array (default: ''),
|
118
|
-
# * *
|
127
|
+
# * *script_safe*: true if U+2028, U+2029 and forward slash (/) should be escaped
|
128
|
+
# as to make the JSON object safe to interpolate in a script tag (default: false).
|
119
129
|
# * *check_circular*: is deprecated now, use the :max_nesting option instead,
|
120
130
|
# * *max_nesting*: sets the maximum level of data structure nesting in
|
121
131
|
# the generated JSON, max_nesting = 0 if no maximum should be checked.
|
@@ -130,7 +140,8 @@ module JSON
|
|
130
140
|
@array_nl = ''
|
131
141
|
@allow_nan = false
|
132
142
|
@ascii_only = false
|
133
|
-
@
|
143
|
+
@script_safe = false
|
144
|
+
@strict = false
|
134
145
|
@buffer_initial_length = 1024
|
135
146
|
configure opts
|
136
147
|
end
|
@@ -158,7 +169,11 @@ module JSON
|
|
158
169
|
|
159
170
|
# If this attribute is set to true, forward slashes will be escaped in
|
160
171
|
# all json strings.
|
161
|
-
attr_accessor :
|
172
|
+
attr_accessor :script_safe
|
173
|
+
|
174
|
+
# If this attribute is set to true, attempting to serialize types not
|
175
|
+
# supported by the JSON spec will raise a JSON::GeneratorError
|
176
|
+
attr_accessor :strict
|
162
177
|
|
163
178
|
# :stopdoc:
|
164
179
|
attr_reader :buffer_initial_length
|
@@ -200,8 +215,13 @@ module JSON
|
|
200
215
|
end
|
201
216
|
|
202
217
|
# Returns true, if forward slashes are escaped. Otherwise returns false.
|
203
|
-
def
|
204
|
-
@
|
218
|
+
def script_safe?
|
219
|
+
@script_safe
|
220
|
+
end
|
221
|
+
|
222
|
+
# Returns true, if forward slashes are escaped. Otherwise returns false.
|
223
|
+
def strict?
|
224
|
+
@strict
|
205
225
|
end
|
206
226
|
|
207
227
|
# Configure this State instance with the Hash _opts_, and return
|
@@ -214,7 +234,7 @@ module JSON
|
|
214
234
|
else
|
215
235
|
raise TypeError, "can't convert #{opts.class} into Hash"
|
216
236
|
end
|
217
|
-
|
237
|
+
opts.each do |key, value|
|
218
238
|
instance_variable_set "@#{key}", value
|
219
239
|
end
|
220
240
|
@indent = opts[:indent] if opts.key?(:indent)
|
@@ -226,7 +246,16 @@ module JSON
|
|
226
246
|
@ascii_only = opts[:ascii_only] if opts.key?(:ascii_only)
|
227
247
|
@depth = opts[:depth] || 0
|
228
248
|
@buffer_initial_length ||= opts[:buffer_initial_length]
|
229
|
-
|
249
|
+
|
250
|
+
@script_safe = if opts.key?(:script_safe)
|
251
|
+
!!opts[:script_safe]
|
252
|
+
elsif opts.key?(:escape_slash)
|
253
|
+
!!opts[:escape_slash]
|
254
|
+
else
|
255
|
+
false
|
256
|
+
end
|
257
|
+
|
258
|
+
@strict = !!opts[:strict] if opts.key?(:strict)
|
230
259
|
|
231
260
|
if !opts.key?(:max_nesting) # defaults to 100
|
232
261
|
@max_nesting = 100
|
@@ -243,7 +272,7 @@ module JSON
|
|
243
272
|
# passed to the configure method.
|
244
273
|
def to_h
|
245
274
|
result = {}
|
246
|
-
|
275
|
+
instance_variables.each do |iv|
|
247
276
|
iv = iv.to_s[1..-1]
|
248
277
|
result[iv.to_sym] = self[iv]
|
249
278
|
end
|
@@ -287,7 +316,13 @@ module JSON
|
|
287
316
|
# Converts this object to a string (calling #to_s), converts
|
288
317
|
# it to a JSON string, and returns the result. This is a fallback, if no
|
289
318
|
# special method #to_json was defined for some object.
|
290
|
-
def to_json(
|
319
|
+
def to_json(generator_state)
|
320
|
+
if generator_state.strict?
|
321
|
+
raise GeneratorError, "#{self.class} not allowed in JSON"
|
322
|
+
else
|
323
|
+
to_s.to_json
|
324
|
+
end
|
325
|
+
end
|
291
326
|
end
|
292
327
|
|
293
328
|
module Hash
|
@@ -310,21 +345,18 @@ module JSON
|
|
310
345
|
end
|
311
346
|
|
312
347
|
def json_transform(state)
|
313
|
-
delim =
|
314
|
-
|
315
|
-
result = '{'
|
316
|
-
result << state.object_nl
|
348
|
+
delim = ",#{state.object_nl}"
|
349
|
+
result = "{#{state.object_nl}"
|
317
350
|
depth = state.depth += 1
|
318
351
|
first = true
|
319
352
|
indent = !state.object_nl.empty?
|
320
|
-
each { |key,value|
|
353
|
+
each { |key, value|
|
321
354
|
result << delim unless first
|
322
355
|
result << state.indent * depth if indent
|
323
|
-
result
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
if value.respond_to?(:to_json)
|
356
|
+
result = "#{result}#{key.to_s.to_json(state)}#{state.space_before}:#{state.space}"
|
357
|
+
if state.strict?
|
358
|
+
raise GeneratorError, "#{value.class} not allowed in JSON"
|
359
|
+
elsif value.respond_to?(:to_json)
|
328
360
|
result << value.to_json(state)
|
329
361
|
else
|
330
362
|
result << %{"#{String(value)}"}
|
@@ -365,7 +397,9 @@ module JSON
|
|
365
397
|
each { |value|
|
366
398
|
result << delim unless first
|
367
399
|
result << state.indent * depth if indent
|
368
|
-
if
|
400
|
+
if state.strict?
|
401
|
+
raise GeneratorError, "#{value.class} not allowed in JSON"
|
402
|
+
elsif value.respond_to?(:to_json)
|
369
403
|
result << value.to_json(state)
|
370
404
|
else
|
371
405
|
result << %{"#{String(value)}"}
|
@@ -419,9 +453,9 @@ module JSON
|
|
419
453
|
string = encode(::Encoding::UTF_8)
|
420
454
|
end
|
421
455
|
if state.ascii_only?
|
422
|
-
'"' << JSON.utf8_to_json_ascii(string, state.
|
456
|
+
'"' << JSON.utf8_to_json_ascii(string, state.script_safe) << '"'
|
423
457
|
else
|
424
|
-
'"' << JSON.utf8_to_json(string, state.
|
458
|
+
'"' << JSON.utf8_to_json(string, state.script_safe) << '"'
|
425
459
|
end
|
426
460
|
end
|
427
461
|
|
data/lib/json/version.rb
CHANGED
data/lib/json.rb
CHANGED
@@ -285,6 +285,15 @@ require 'json/common'
|
|
285
285
|
# # Raises JSON::NestingError (nesting of 2 is too deep):
|
286
286
|
# JSON.generate(obj, max_nesting: 2)
|
287
287
|
#
|
288
|
+
# ====== Escaping Options
|
289
|
+
#
|
290
|
+
# Options +script_safe+ (boolean) specifies wether <tt>'\u2028'</tt>, <tt>'\u2029'</tt>
|
291
|
+
# and <tt>'/'</tt> should be escaped as to make the JSON object safe to interpolate in script
|
292
|
+
# tags.
|
293
|
+
#
|
294
|
+
# Options +ascii_only+ (boolean) specifies wether all characters outside the ASCII range
|
295
|
+
# should be escaped.
|
296
|
+
#
|
288
297
|
# ====== Output Options
|
289
298
|
#
|
290
299
|
# The default formatting options generate the most compact
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Daniel Luz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A JSON implementation as a JRuby extension.
|
14
14
|
email: dev+ruby@mernen.com
|
@@ -34,19 +34,21 @@ files:
|
|
34
34
|
- lib/json/add/time.rb
|
35
35
|
- lib/json/common.rb
|
36
36
|
- lib/json/ext.rb
|
37
|
+
- lib/json/ext/generator.jar
|
38
|
+
- lib/json/ext/parser.jar
|
37
39
|
- lib/json/generic_object.rb
|
38
40
|
- lib/json/pure.rb
|
39
41
|
- lib/json/pure/generator.rb
|
40
42
|
- lib/json/pure/parser.rb
|
41
43
|
- lib/json/version.rb
|
42
|
-
homepage:
|
44
|
+
homepage: https://flori.github.io/json
|
43
45
|
licenses:
|
44
46
|
- Ruby
|
45
47
|
metadata:
|
46
48
|
bug_tracker_uri: https://github.com/flori/json/issues
|
47
49
|
changelog_uri: https://github.com/flori/json/blob/master/CHANGES.md
|
48
|
-
documentation_uri:
|
49
|
-
homepage_uri:
|
50
|
+
documentation_uri: https://flori.github.io/json/doc/index.html
|
51
|
+
homepage_uri: https://flori.github.io/json
|
50
52
|
source_code_uri: https://github.com/flori/json
|
51
53
|
wiki_uri: https://github.com/flori/json/wiki
|
52
54
|
post_install_message:
|
@@ -64,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
66
|
- !ruby/object:Gem::Version
|
65
67
|
version: '0'
|
66
68
|
requirements: []
|
67
|
-
rubygems_version: 3.3.
|
69
|
+
rubygems_version: 3.3.26
|
68
70
|
signing_key:
|
69
71
|
specification_version: 4
|
70
72
|
summary: JSON Implementation for Ruby
|