json 2.5.1 → 2.6.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.
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
- }