json 2.5.1 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +5 -5
  3. data/README.md +3 -3
  4. data/VERSION +1 -1
  5. data/ext/json/ext/generator/generator.c +1 -11
  6. data/ext/json/ext/parser/extconf.rb +1 -0
  7. data/ext/json/ext/parser/parser.c +2972 -1813
  8. data/ext/json/ext/parser/parser.h +5 -1
  9. data/ext/json/ext/parser/parser.rl +66 -28
  10. data/json.gemspec +2 -8
  11. data/lib/json/pure/parser.rb +1 -1
  12. data/lib/json/version.rb +1 -1
  13. data/lib/json.rb +1 -1
  14. metadata +6 -87
  15. data/Gemfile +0 -14
  16. data/lib/json/ext/.keep +0 -0
  17. data/tests/fixtures/fail10.json +0 -1
  18. data/tests/fixtures/fail11.json +0 -1
  19. data/tests/fixtures/fail12.json +0 -1
  20. data/tests/fixtures/fail13.json +0 -1
  21. data/tests/fixtures/fail14.json +0 -1
  22. data/tests/fixtures/fail18.json +0 -1
  23. data/tests/fixtures/fail19.json +0 -1
  24. data/tests/fixtures/fail2.json +0 -1
  25. data/tests/fixtures/fail20.json +0 -1
  26. data/tests/fixtures/fail21.json +0 -1
  27. data/tests/fixtures/fail22.json +0 -1
  28. data/tests/fixtures/fail23.json +0 -1
  29. data/tests/fixtures/fail24.json +0 -1
  30. data/tests/fixtures/fail25.json +0 -1
  31. data/tests/fixtures/fail27.json +0 -2
  32. data/tests/fixtures/fail28.json +0 -2
  33. data/tests/fixtures/fail29.json +0 -1
  34. data/tests/fixtures/fail3.json +0 -1
  35. data/tests/fixtures/fail30.json +0 -1
  36. data/tests/fixtures/fail31.json +0 -1
  37. data/tests/fixtures/fail32.json +0 -1
  38. data/tests/fixtures/fail4.json +0 -1
  39. data/tests/fixtures/fail5.json +0 -1
  40. data/tests/fixtures/fail6.json +0 -1
  41. data/tests/fixtures/fail7.json +0 -1
  42. data/tests/fixtures/fail8.json +0 -1
  43. data/tests/fixtures/fail9.json +0 -1
  44. data/tests/fixtures/obsolete_fail1.json +0 -1
  45. data/tests/fixtures/pass1.json +0 -56
  46. data/tests/fixtures/pass15.json +0 -1
  47. data/tests/fixtures/pass16.json +0 -1
  48. data/tests/fixtures/pass17.json +0 -1
  49. data/tests/fixtures/pass2.json +0 -1
  50. data/tests/fixtures/pass26.json +0 -1
  51. data/tests/fixtures/pass3.json +0 -6
  52. data/tests/json_addition_test.rb +0 -199
  53. data/tests/json_common_interface_test.rb +0 -169
  54. data/tests/json_encoding_test.rb +0 -107
  55. data/tests/json_ext_parser_test.rb +0 -15
  56. data/tests/json_fixtures_test.rb +0 -40
  57. data/tests/json_generator_test.rb +0 -399
  58. data/tests/json_generic_object_test.rb +0 -82
  59. data/tests/json_parser_test.rb +0 -497
  60. data/tests/json_string_matching_test.rb +0 -38
  61. data/tests/lib/core_assertions.rb +0 -763
  62. data/tests/lib/envutil.rb +0 -365
  63. data/tests/lib/find_executable.rb +0 -22
  64. data/tests/lib/helper.rb +0 -4
  65. data/tests/ractor_test.rb +0 -30
  66. data/tests/test_helper.rb +0 -17
@@ -13,6 +13,10 @@
13
13
  #include "st.h"
14
14
  #endif
15
15
 
16
+ #ifndef MAYBE_UNUSED
17
+ # define MAYBE_UNUSED(x) x
18
+ #endif
19
+
16
20
  #define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
17
21
 
18
22
  /* unicode */
@@ -63,7 +67,7 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
63
67
  static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result);
64
68
  static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result);
65
69
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
66
- static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd);
70
+ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize);
67
71
  static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result);
68
72
  static VALUE convert_encoding(VALUE source);
69
73
  static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self);
@@ -452,17 +452,29 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
452
452
  }
453
453
  }
454
454
 
455
- static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
455
+ static const size_t MAX_STACK_BUFFER_SIZE = 128;
456
+ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize)
456
457
  {
457
- char *p = string, *pe = string, *unescape;
458
+ VALUE result = Qnil;
459
+ size_t bufferSize = stringEnd - string;
460
+ char *p = string, *pe = string, *unescape, *bufferStart, *buffer;
458
461
  int unescape_len;
459
462
  char buf[4];
460
463
 
464
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
465
+ bufferStart = buffer = ALLOC_N(char, bufferSize);
466
+ } else {
467
+ bufferStart = buffer = ALLOCA_N(char, bufferSize);
468
+ }
469
+
461
470
  while (pe < stringEnd) {
462
471
  if (*pe == '\\') {
463
472
  unescape = (char *) "?";
464
473
  unescape_len = 1;
465
- if (pe > p) rb_str_buf_cat(result, p, pe - p);
474
+ if (pe > p) {
475
+ MEMCPY(buffer, p, char, pe - p);
476
+ buffer += pe - p;
477
+ }
466
478
  switch (*++pe) {
467
479
  case 'n':
468
480
  unescape = (char *) "\n";
@@ -487,6 +499,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
487
499
  break;
488
500
  case 'u':
489
501
  if (pe > stringEnd - 4) {
502
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
503
+ free(bufferStart);
504
+ }
490
505
  rb_enc_raise(
491
506
  EXC_ENCODING eParserError,
492
507
  "%u: incomplete unicode character escape sequence at '%s'", __LINE__, p
@@ -497,6 +512,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
497
512
  if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
498
513
  pe++;
499
514
  if (pe > stringEnd - 6) {
515
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
516
+ free(bufferStart);
517
+ }
500
518
  rb_enc_raise(
501
519
  EXC_ENCODING eParserError,
502
520
  "%u: incomplete surrogate pair at '%s'", __LINE__, p
@@ -520,13 +538,55 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
520
538
  p = pe;
521
539
  continue;
522
540
  }
523
- rb_str_buf_cat(result, unescape, unescape_len);
541
+ MEMCPY(buffer, unescape, char, unescape_len);
542
+ buffer += unescape_len;
524
543
  p = ++pe;
525
544
  } else {
526
545
  pe++;
527
546
  }
528
547
  }
529
- rb_str_buf_cat(result, p, pe - p);
548
+
549
+ if (pe > p) {
550
+ MEMCPY(buffer, p, char, pe - p);
551
+ buffer += pe - p;
552
+ }
553
+
554
+ # ifdef HAVE_RB_ENC_INTERNED_STR
555
+ if (intern) {
556
+ result = rb_enc_interned_str(bufferStart, (long)(buffer - bufferStart), rb_utf8_encoding());
557
+ } else {
558
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
559
+ }
560
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
561
+ free(bufferStart);
562
+ }
563
+ # else
564
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
565
+
566
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
567
+ free(bufferStart);
568
+ }
569
+
570
+ if (intern) {
571
+ # if STR_UMINUS_DEDUPE_FROZEN
572
+ // Starting from MRI 2.8 it is preferable to freeze the string
573
+ // before deduplication so that it can be interned directly
574
+ // otherwise it would be duplicated first which is wasteful.
575
+ result = rb_funcall(rb_str_freeze(result), i_uminus, 0);
576
+ # elif STR_UMINUS_DEDUPE
577
+ // MRI 2.5 and older do not deduplicate strings that are already
578
+ // frozen.
579
+ result = rb_funcall(result, i_uminus, 0);
580
+ # else
581
+ result = rb_str_freeze(result);
582
+ # endif
583
+ }
584
+ # endif
585
+
586
+ if (symbolize) {
587
+ result = rb_str_intern(result);
588
+ }
589
+
530
590
  return result;
531
591
  }
532
592
 
@@ -537,12 +597,11 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
537
597
  write data;
538
598
 
539
599
  action parse_string {
540
- *result = json_string_unescape(*result, json->memo + 1, p);
600
+ *result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
541
601
  if (NIL_P(*result)) {
542
602
  fhold;
543
603
  fbreak;
544
604
  } else {
545
- FORCE_UTF8(*result);
546
605
  fexec p + 1;
547
606
  }
548
607
  }
@@ -569,7 +628,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
569
628
  int cs = EVIL;
570
629
  VALUE match_string;
571
630
 
572
- *result = rb_str_buf_new(0);
573
631
  %% write init;
574
632
  json->memo = p;
575
633
  %% write exec;
@@ -585,26 +643,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
585
643
  }
586
644
  }
587
645
 
588
- if (json->symbolize_names && json->parsing_name) {
589
- *result = rb_str_intern(*result);
590
- } else if (RB_TYPE_P(*result, T_STRING)) {
591
- # if STR_UMINUS_DEDUPE_FROZEN
592
- if (json->freeze) {
593
- // Starting from MRI 2.8 it is preferable to freeze the string
594
- // before deduplication so that it can be interned directly
595
- // otherwise it would be duplicated first which is wasteful.
596
- *result = rb_funcall(rb_str_freeze(*result), i_uminus, 0);
597
- }
598
- # elif STR_UMINUS_DEDUPE
599
- if (json->freeze) {
600
- // MRI 2.5 and older do not deduplicate strings that are already
601
- // frozen.
602
- *result = rb_funcall(*result, i_uminus, 0);
603
- }
604
- # else
605
- rb_str_resize(*result, RSTRING_LEN(*result));
606
- # endif
607
- }
608
646
  if (cs >= JSON_string_first_final) {
609
647
  return p + 1;
610
648
  } else {
data/json.gemspec CHANGED
@@ -15,7 +15,6 @@ Gem::Specification.new do |s|
15
15
  s.rdoc_options = ["--title", "JSON implementation for Ruby", "--main", "README.md"]
16
16
  s.files = [
17
17
  "CHANGES.md",
18
- "Gemfile",
19
18
  "LICENSE",
20
19
  "README.md",
21
20
  "VERSION",
@@ -48,13 +47,12 @@ Gem::Specification.new do |s|
48
47
  "lib/json/add/time.rb",
49
48
  "lib/json/common.rb",
50
49
  "lib/json/ext.rb",
51
- "lib/json/ext/.keep",
52
50
  "lib/json/generic_object.rb",
53
51
  "lib/json/pure.rb",
54
52
  "lib/json/pure/generator.rb",
55
53
  "lib/json/pure/parser.rb",
56
54
  "lib/json/version.rb",
57
- ] + Dir["tests/**/*"]
55
+ ]
58
56
  s.homepage = "http://flori.github.com/json"
59
57
  s.metadata = {
60
58
  'bug_tracker_uri' => 'https://github.com/flori/json/issues',
@@ -65,9 +63,5 @@ Gem::Specification.new do |s|
65
63
  'wiki_uri' => 'https://github.com/flori/json/wiki'
66
64
  }
67
65
 
68
- s.required_ruby_version = Gem::Requirement.new(">= 2.0")
69
- s.test_files = ["tests/test_helper.rb"]
70
-
71
- s.add_development_dependency "rake"
72
- s.add_development_dependency "test-unit"
66
+ s.required_ruby_version = Gem::Requirement.new(">= 2.3")
73
67
  end
@@ -45,7 +45,7 @@ module JSON
45
45
  /(?=\*/) # single slash before this comment's end
46
46
  )*
47
47
  \*/ # the End of this comment
48
- |[ \t\r\n]+ # whitespaces: space, horicontal tab, lf, cr
48
+ |[ \t\r\n]+ # whitespaces: space, horizontal tab, lf, cr
49
49
  )+
50
50
  )mx
51
51
 
data/lib/json/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
  module JSON
3
3
  # JSON version
4
- VERSION = '2.5.1'
4
+ VERSION = '2.6.0'
5
5
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
6
6
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
7
7
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
data/lib/json.rb CHANGED
@@ -493,7 +493,7 @@ require 'json/common'
493
493
  # json = JSON.generate(ruby0) # {"json_class":"Customer","v":["Dave","123 Main"]}
494
494
  # ruby1 = JSON.parse(json, create_additions: true) # #<struct Customer name="Dave", address="123 Main">
495
495
  # ruby1.class # Customer
496
- #
496
+ #
497
497
  # \Symbol:
498
498
  # require 'json/add/symbol'
499
499
  # ruby0 = :foo # foo
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-22 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: test-unit
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
11
+ date: 2021-10-14 00:00:00.000000000 Z
12
+ dependencies: []
41
13
  description: This is a JSON implementation as a Ruby extension in C.
42
14
  email: flori@ping.de
43
15
  executables: []
@@ -49,7 +21,6 @@ extra_rdoc_files:
49
21
  - README.md
50
22
  files:
51
23
  - CHANGES.md
52
- - Gemfile
53
24
  - LICENSE
54
25
  - README.md
55
26
  - VERSION
@@ -82,62 +53,11 @@ files:
82
53
  - lib/json/add/time.rb
83
54
  - lib/json/common.rb
84
55
  - lib/json/ext.rb
85
- - lib/json/ext/.keep
86
56
  - lib/json/generic_object.rb
87
57
  - lib/json/pure.rb
88
58
  - lib/json/pure/generator.rb
89
59
  - lib/json/pure/parser.rb
90
60
  - lib/json/version.rb
91
- - tests/fixtures/fail10.json
92
- - tests/fixtures/fail11.json
93
- - tests/fixtures/fail12.json
94
- - tests/fixtures/fail13.json
95
- - tests/fixtures/fail14.json
96
- - tests/fixtures/fail18.json
97
- - tests/fixtures/fail19.json
98
- - tests/fixtures/fail2.json
99
- - tests/fixtures/fail20.json
100
- - tests/fixtures/fail21.json
101
- - tests/fixtures/fail22.json
102
- - tests/fixtures/fail23.json
103
- - tests/fixtures/fail24.json
104
- - tests/fixtures/fail25.json
105
- - tests/fixtures/fail27.json
106
- - tests/fixtures/fail28.json
107
- - tests/fixtures/fail29.json
108
- - tests/fixtures/fail3.json
109
- - tests/fixtures/fail30.json
110
- - tests/fixtures/fail31.json
111
- - tests/fixtures/fail32.json
112
- - tests/fixtures/fail4.json
113
- - tests/fixtures/fail5.json
114
- - tests/fixtures/fail6.json
115
- - tests/fixtures/fail7.json
116
- - tests/fixtures/fail8.json
117
- - tests/fixtures/fail9.json
118
- - tests/fixtures/obsolete_fail1.json
119
- - tests/fixtures/pass1.json
120
- - tests/fixtures/pass15.json
121
- - tests/fixtures/pass16.json
122
- - tests/fixtures/pass17.json
123
- - tests/fixtures/pass2.json
124
- - tests/fixtures/pass26.json
125
- - tests/fixtures/pass3.json
126
- - tests/json_addition_test.rb
127
- - tests/json_common_interface_test.rb
128
- - tests/json_encoding_test.rb
129
- - tests/json_ext_parser_test.rb
130
- - tests/json_fixtures_test.rb
131
- - tests/json_generator_test.rb
132
- - tests/json_generic_object_test.rb
133
- - tests/json_parser_test.rb
134
- - tests/json_string_matching_test.rb
135
- - tests/lib/core_assertions.rb
136
- - tests/lib/envutil.rb
137
- - tests/lib/find_executable.rb
138
- - tests/lib/helper.rb
139
- - tests/ractor_test.rb
140
- - tests/test_helper.rb
141
61
  homepage: http://flori.github.com/json
142
62
  licenses:
143
63
  - Ruby
@@ -160,16 +80,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
80
  requirements:
161
81
  - - ">="
162
82
  - !ruby/object:Gem::Version
163
- version: '2.0'
83
+ version: '2.3'
164
84
  required_rubygems_version: !ruby/object:Gem::Requirement
165
85
  requirements:
166
86
  - - ">="
167
87
  - !ruby/object:Gem::Version
168
88
  version: '0'
169
89
  requirements: []
170
- rubygems_version: 3.2.2
90
+ rubygems_version: 3.3.0.dev
171
91
  signing_key:
172
92
  specification_version: 4
173
93
  summary: JSON Implementation for Ruby
174
- test_files:
175
- - tests/test_helper.rb
94
+ test_files: []
data/Gemfile DELETED
@@ -1,14 +0,0 @@
1
- # vim: set ft=ruby:
2
-
3
- source 'https://rubygems.org'
4
-
5
- case ENV['JSON']
6
- when 'ext', nil
7
- if ENV['RUBY_ENGINE'] == 'jruby'
8
- gemspec :name => 'json-java'
9
- else
10
- gemspec :name => 'json'
11
- end
12
- when 'pure'
13
- gemspec :name => 'json_pure'
14
- end
data/lib/json/ext/.keep DELETED
File without changes
@@ -1 +0,0 @@
1
- {"Extra value after close": true} "misplaced quoted value"
@@ -1 +0,0 @@
1
- {"Illegal expression": 1 + 2}
@@ -1 +0,0 @@
1
- {"Illegal invocation": alert()}
@@ -1 +0,0 @@
1
- {"Numbers cannot have leading zeroes": 013}
@@ -1 +0,0 @@
1
- {"Numbers cannot be hex": 0x14}
@@ -1 +0,0 @@
1
- [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
@@ -1 +0,0 @@
1
- {"Missing colon" null}
@@ -1 +0,0 @@
1
- ["Unclosed array"
@@ -1 +0,0 @@
1
- {"Double colon":: null}
@@ -1 +0,0 @@
1
- {"Comma instead of colon", null}
@@ -1 +0,0 @@
1
- ["Colon instead of comma": false]
@@ -1 +0,0 @@
1
- ["Bad value", truth]
@@ -1 +0,0 @@
1
- ['single quote']
@@ -1 +0,0 @@
1
- ["tab character in string "]
@@ -1,2 +0,0 @@
1
- ["line
2
- break"]
@@ -1,2 +0,0 @@
1
- ["line\
2
- break"]
@@ -1 +0,0 @@
1
- {
@@ -1 +0,0 @@
1
- {unquoted_key: "keys must be quoted"}
@@ -1 +0,0 @@
1
- [
@@ -1 +0,0 @@
1
- [1, 2, 3,
@@ -1 +0,0 @@
1
- {"foo": "bar"
@@ -1 +0,0 @@
1
- ["extra comma",]
@@ -1 +0,0 @@
1
- ["double extra comma",,]
@@ -1 +0,0 @@
1
- [ , "<-- missing value"]
@@ -1 +0,0 @@
1
- ["Comma after the close"],
@@ -1 +0,0 @@
1
- ["Extra close"]]
@@ -1 +0,0 @@
1
- {"Extra comma": true,}
@@ -1 +0,0 @@
1
- "A JSON payload should be an object or array, not a string."
@@ -1,56 +0,0 @@
1
- [
2
- "JSON Test Pattern pass1",
3
- {"object with 1 member":["array with 1 element"]},
4
- {},
5
- [],
6
- -42,
7
- true,
8
- false,
9
- null,
10
- {
11
- "integer": 1234567890,
12
- "real": -9876.543210,
13
- "e": 0.123456789e-12,
14
- "E": 1.234567890E+34,
15
- "": 23456789012E666,
16
- "zero": 0,
17
- "one": 1,
18
- "space": " ",
19
- "quote": "\"",
20
- "backslash": "\\",
21
- "controls": "\b\f\n\r\t",
22
- "slash": "/ & \/",
23
- "alpha": "abcdefghijklmnopqrstuvwyz",
24
- "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",
25
- "digit": "0123456789",
26
- "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
27
- "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
28
- "true": true,
29
- "false": false,
30
- "null": null,
31
- "array":[ ],
32
- "object":{ },
33
- "address": "50 St. James Street",
34
- "url": "http://www.JSON.org/",
35
- "comment": "// /* <!-- --",
36
- "# -- --> */": " ",
37
- " s p a c e d " :[1,2 , 3
38
-
39
- ,
40
-
41
- 4 , 5 , 6 ,7 ],
42
- "compact": [1,2,3,4,5,6,7],
43
- "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}",
44
- "quotes": "&#34; \u0022 %22 0x22 034 &#x22;",
45
- "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"
46
- : "A key can be any string"
47
- },
48
- 0.5 ,98.6
49
- ,
50
- 99.44
51
- ,
52
-
53
- 1066
54
-
55
-
56
- ,"rosebud"]
@@ -1 +0,0 @@
1
- ["Illegal backslash escape: \x15"]
@@ -1 +0,0 @@
1
- ["Illegal backslash escape: \'"]
@@ -1 +0,0 @@
1
- ["Illegal backslash escape: \017"]
@@ -1 +0,0 @@
1
- [[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
@@ -1 +0,0 @@
1
- ["tab\ character\ in\ string\ "]
@@ -1,6 +0,0 @@
1
- {
2
- "JSON Test Pattern pass3": {
3
- "The outermost value": "must be an object or array.",
4
- "In this test": "It is an object."
5
- }
6
- }