json 2.5.1 → 2.6.2

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 +16 -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 +2981 -1813
  8. data/ext/json/ext/parser/parser.h +5 -1
  9. data/ext/json/ext/parser/parser.rl +75 -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,37 @@ 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
+ # ifdef HAVE_RB_ENC_INTERNED_STR
466
+ bufferStart = buffer = ALLOC_N(char, bufferSize ? bufferSize : 1);
467
+ # else
468
+ bufferStart = buffer = ALLOC_N(char, bufferSize);
469
+ # endif
470
+ } else {
471
+ # ifdef HAVE_RB_ENC_INTERNED_STR
472
+ bufferStart = buffer = ALLOCA_N(char, bufferSize ? bufferSize : 1);
473
+ # else
474
+ bufferStart = buffer = ALLOCA_N(char, bufferSize);
475
+ # endif
476
+ }
477
+
461
478
  while (pe < stringEnd) {
462
479
  if (*pe == '\\') {
463
480
  unescape = (char *) "?";
464
481
  unescape_len = 1;
465
- if (pe > p) rb_str_buf_cat(result, p, pe - p);
482
+ if (pe > p) {
483
+ MEMCPY(buffer, p, char, pe - p);
484
+ buffer += pe - p;
485
+ }
466
486
  switch (*++pe) {
467
487
  case 'n':
468
488
  unescape = (char *) "\n";
@@ -487,6 +507,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
487
507
  break;
488
508
  case 'u':
489
509
  if (pe > stringEnd - 4) {
510
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
511
+ free(bufferStart);
512
+ }
490
513
  rb_enc_raise(
491
514
  EXC_ENCODING eParserError,
492
515
  "%u: incomplete unicode character escape sequence at '%s'", __LINE__, p
@@ -497,6 +520,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
497
520
  if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
498
521
  pe++;
499
522
  if (pe > stringEnd - 6) {
523
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
524
+ free(bufferStart);
525
+ }
500
526
  rb_enc_raise(
501
527
  EXC_ENCODING eParserError,
502
528
  "%u: incomplete surrogate pair at '%s'", __LINE__, p
@@ -520,13 +546,55 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
520
546
  p = pe;
521
547
  continue;
522
548
  }
523
- rb_str_buf_cat(result, unescape, unescape_len);
549
+ MEMCPY(buffer, unescape, char, unescape_len);
550
+ buffer += unescape_len;
524
551
  p = ++pe;
525
552
  } else {
526
553
  pe++;
527
554
  }
528
555
  }
529
- rb_str_buf_cat(result, p, pe - p);
556
+
557
+ if (pe > p) {
558
+ MEMCPY(buffer, p, char, pe - p);
559
+ buffer += pe - p;
560
+ }
561
+
562
+ # ifdef HAVE_RB_ENC_INTERNED_STR
563
+ if (intern) {
564
+ result = rb_enc_interned_str(bufferStart, (long)(buffer - bufferStart), rb_utf8_encoding());
565
+ } else {
566
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
567
+ }
568
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
569
+ free(bufferStart);
570
+ }
571
+ # else
572
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
573
+
574
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
575
+ free(bufferStart);
576
+ }
577
+
578
+ if (intern) {
579
+ # if STR_UMINUS_DEDUPE_FROZEN
580
+ // Starting from MRI 2.8 it is preferable to freeze the string
581
+ // before deduplication so that it can be interned directly
582
+ // otherwise it would be duplicated first which is wasteful.
583
+ result = rb_funcall(rb_str_freeze(result), i_uminus, 0);
584
+ # elif STR_UMINUS_DEDUPE
585
+ // MRI 2.5 and older do not deduplicate strings that are already
586
+ // frozen.
587
+ result = rb_funcall(result, i_uminus, 0);
588
+ # else
589
+ result = rb_str_freeze(result);
590
+ # endif
591
+ }
592
+ # endif
593
+
594
+ if (symbolize) {
595
+ result = rb_str_intern(result);
596
+ }
597
+
530
598
  return result;
531
599
  }
532
600
 
@@ -537,12 +605,11 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
537
605
  write data;
538
606
 
539
607
  action parse_string {
540
- *result = json_string_unescape(*result, json->memo + 1, p);
608
+ *result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
541
609
  if (NIL_P(*result)) {
542
610
  fhold;
543
611
  fbreak;
544
612
  } else {
545
- FORCE_UTF8(*result);
546
613
  fexec p + 1;
547
614
  }
548
615
  }
@@ -569,7 +636,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
569
636
  int cs = EVIL;
570
637
  VALUE match_string;
571
638
 
572
- *result = rb_str_buf_new(0);
573
639
  %% write init;
574
640
  json->memo = p;
575
641
  %% write exec;
@@ -585,26 +651,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
585
651
  }
586
652
  }
587
653
 
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
654
  if (cs >= JSON_string_first_final) {
609
655
  return p + 1;
610
656
  } else {
@@ -801,6 +847,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
801
847
  *
802
848
  * Parses the current JSON text _source_ and returns the complete data
803
849
  * structure as a result.
850
+ * It raises JSON::ParseError if fail to parse.
804
851
  */
805
852
  static VALUE cParser_parse(VALUE self)
806
853
  {
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.2'
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.2
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: 2022-05-16 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.13
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
- }