json 1.5.1 → 1.5.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of json might be problematic. Click here for more details.
- data/CHANGES +5 -0
- data/{README → README.rdoc} +0 -0
- data/Rakefile +41 -55
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +11 -10
- data/ext/json/ext/generator/generator.h +3 -3
- data/ext/json/ext/parser/parser.c +81 -71
- data/ext/json/ext/parser/parser.h +5 -5
- data/ext/json/ext/parser/parser.rl +13 -3
- data/java/src/json/ext/Generator.java +1 -5
- data/java/src/json/ext/Parser.java +34 -26
- data/java/src/json/ext/Parser.rl +10 -2
- data/json.gemspec +41 -0
- data/json_pure.gemspec +40 -0
- data/lib/json.rb +52 -0
- data/lib/json/add/core.rb +35 -4
- data/lib/json/common.rb +5 -1
- data/lib/json/pure/generator.rb +1 -1
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +25 -6
- data/tests/test_json_generate.rb +1 -0
- metadata +164 -140
@@ -23,9 +23,9 @@
|
|
23
23
|
|
24
24
|
/* unicode */
|
25
25
|
|
26
|
-
typedef unsigned long
|
27
|
-
typedef unsigned short UTF16;
|
28
|
-
typedef unsigned char
|
26
|
+
typedef unsigned long UTF32; /* at least 32 bits */
|
27
|
+
typedef unsigned short UTF16; /* at least 16 bits */
|
28
|
+
typedef unsigned char UTF8; /* typically 8 bits */
|
29
29
|
|
30
30
|
#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
|
31
31
|
#define UNI_SUR_HIGH_START (UTF32)0xD800
|
@@ -46,8 +46,8 @@ typedef struct JSON_ParserStruct {
|
|
46
46
|
int symbolize_names;
|
47
47
|
VALUE object_class;
|
48
48
|
VALUE array_class;
|
49
|
-
|
50
|
-
|
49
|
+
int create_additions;
|
50
|
+
VALUE match_string;
|
51
51
|
} JSON_Parser;
|
52
52
|
|
53
53
|
#define GET_PARSER \
|
@@ -77,7 +77,7 @@ static VALUE CNaN, CInfinity, CMinusInfinity;
|
|
77
77
|
|
78
78
|
static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
79
79
|
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_object_class,
|
80
|
-
i_array_class, i_key_p, i_deep_const_get, i_match, i_match_string;
|
80
|
+
i_array_class, i_key_p, i_deep_const_get, i_match, i_match_string, i_aset, i_leftshift;
|
81
81
|
|
82
82
|
%%{
|
83
83
|
machine JSON_common;
|
@@ -119,7 +119,11 @@ static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
|
119
119
|
if (np == NULL) {
|
120
120
|
fhold; fbreak;
|
121
121
|
} else {
|
122
|
-
|
122
|
+
if (NIL_P(json->object_class)) {
|
123
|
+
rb_hash_aset(*result, last_name, v);
|
124
|
+
} else {
|
125
|
+
rb_funcall(*result, i_aset, 2, last_name, v);
|
126
|
+
}
|
123
127
|
fexec np;
|
124
128
|
}
|
125
129
|
}
|
@@ -342,7 +346,11 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
342
346
|
if (np == NULL) {
|
343
347
|
fhold; fbreak;
|
344
348
|
} else {
|
345
|
-
|
349
|
+
if (NIL_P(json->array_class)) {
|
350
|
+
rb_ary_push(*result, v);
|
351
|
+
} else {
|
352
|
+
rb_funcall(*result, i_leftshift, 1, v);
|
353
|
+
}
|
346
354
|
fexec np;
|
347
355
|
}
|
348
356
|
}
|
@@ -809,6 +817,8 @@ void Init_parser()
|
|
809
817
|
i_match_string = rb_intern("match_string");
|
810
818
|
i_key_p = rb_intern("key?");
|
811
819
|
i_deep_const_get = rb_intern("deep_const_get");
|
820
|
+
i_aset = rb_intern("[]=");
|
821
|
+
i_leftshift = rb_intern("<<");
|
812
822
|
#ifdef HAVE_RUBY_ENCODING_H
|
813
823
|
CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
|
814
824
|
CEncoding_UTF_16BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16be"));
|
@@ -354,11 +354,7 @@ public final class Generator {
|
|
354
354
|
state.decreaseDepth();
|
355
355
|
if (objectNl.length() != 0) {
|
356
356
|
buffer.append(objectNl);
|
357
|
-
|
358
|
-
for (int i = 0; i < state.getDepth(); i++) {
|
359
|
-
buffer.append(indent);
|
360
|
-
}
|
361
|
-
}
|
357
|
+
buffer.append(Utils.repeat(state.getIndent(), state.getDepth()));
|
362
358
|
}
|
363
359
|
buffer.append((byte)'}');
|
364
360
|
}
|
@@ -1528,7 +1528,7 @@ static final int JSON_array_error = 0;
|
|
1528
1528
|
static final int JSON_array_en_main = 1;
|
1529
1529
|
|
1530
1530
|
|
1531
|
-
// line
|
1531
|
+
// line 624 "Parser.rl"
|
1532
1532
|
|
1533
1533
|
|
1534
1534
|
ParserResult parseArray(int p, int pe) {
|
@@ -1551,7 +1551,7 @@ static final int JSON_array_en_main = 1;
|
|
1551
1551
|
cs = JSON_array_start;
|
1552
1552
|
}
|
1553
1553
|
|
1554
|
-
// line
|
1554
|
+
// line 641 "Parser.rl"
|
1555
1555
|
|
1556
1556
|
// line 1557 "Parser.java"
|
1557
1557
|
{
|
@@ -1641,19 +1641,23 @@ case 1:
|
|
1641
1641
|
p--;
|
1642
1642
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1643
1643
|
} else {
|
1644
|
-
|
1644
|
+
if (!parser.arrayClass.getName().equals("Array")) {
|
1645
|
+
result.callMethod(context, "<<", res.result);
|
1646
|
+
} else {
|
1647
|
+
result.append(res.result);
|
1648
|
+
}
|
1645
1649
|
{p = (( res.p))-1;}
|
1646
1650
|
}
|
1647
1651
|
}
|
1648
1652
|
break;
|
1649
1653
|
case 1:
|
1650
|
-
// line
|
1654
|
+
// line 608 "Parser.rl"
|
1651
1655
|
{
|
1652
1656
|
p--;
|
1653
1657
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1654
1658
|
}
|
1655
1659
|
break;
|
1656
|
-
// line
|
1660
|
+
// line 1661 "Parser.java"
|
1657
1661
|
}
|
1658
1662
|
}
|
1659
1663
|
}
|
@@ -1673,7 +1677,7 @@ case 5:
|
|
1673
1677
|
break; }
|
1674
1678
|
}
|
1675
1679
|
|
1676
|
-
// line
|
1680
|
+
// line 642 "Parser.rl"
|
1677
1681
|
|
1678
1682
|
if (cs >= JSON_array_first_final) {
|
1679
1683
|
return new ParserResult(result, p + 1);
|
@@ -1683,7 +1687,7 @@ case 5:
|
|
1683
1687
|
}
|
1684
1688
|
|
1685
1689
|
|
1686
|
-
// line
|
1690
|
+
// line 1691 "Parser.java"
|
1687
1691
|
private static byte[] init__JSON_object_actions_0()
|
1688
1692
|
{
|
1689
1693
|
return new byte [] {
|
@@ -1806,7 +1810,7 @@ static final int JSON_object_error = 0;
|
|
1806
1810
|
static final int JSON_object_en_main = 1;
|
1807
1811
|
|
1808
1812
|
|
1809
|
-
// line
|
1813
|
+
// line 702 "Parser.rl"
|
1810
1814
|
|
1811
1815
|
|
1812
1816
|
ParserResult parseObject(int p, int pe) {
|
@@ -1825,14 +1829,14 @@ static final int JSON_object_en_main = 1;
|
|
1825
1829
|
IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
|
1826
1830
|
|
1827
1831
|
|
1828
|
-
// line
|
1832
|
+
// line 1833 "Parser.java"
|
1829
1833
|
{
|
1830
1834
|
cs = JSON_object_start;
|
1831
1835
|
}
|
1832
1836
|
|
1833
|
-
// line
|
1837
|
+
// line 720 "Parser.rl"
|
1834
1838
|
|
1835
|
-
// line
|
1839
|
+
// line 1840 "Parser.java"
|
1836
1840
|
{
|
1837
1841
|
int _klen;
|
1838
1842
|
int _trans = 0;
|
@@ -1913,20 +1917,24 @@ case 1:
|
|
1913
1917
|
switch ( _JSON_object_actions[_acts++] )
|
1914
1918
|
{
|
1915
1919
|
case 0:
|
1916
|
-
// line
|
1920
|
+
// line 656 "Parser.rl"
|
1917
1921
|
{
|
1918
1922
|
ParserResult res = parseValue(p, pe);
|
1919
1923
|
if (res == null) {
|
1920
1924
|
p--;
|
1921
1925
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1922
1926
|
} else {
|
1923
|
-
|
1927
|
+
if (!parser.objectClass.getName().equals("Hash")) {
|
1928
|
+
result.callMethod(context, "[]=", new IRubyObject[] { lastName, res.result });
|
1929
|
+
} else {
|
1930
|
+
result.op_aset(context, lastName, res.result);
|
1931
|
+
}
|
1924
1932
|
{p = (( res.p))-1;}
|
1925
1933
|
}
|
1926
1934
|
}
|
1927
1935
|
break;
|
1928
1936
|
case 1:
|
1929
|
-
// line
|
1937
|
+
// line 671 "Parser.rl"
|
1930
1938
|
{
|
1931
1939
|
ParserResult res = parseString(p, pe);
|
1932
1940
|
if (res == null) {
|
@@ -1946,13 +1954,13 @@ case 1:
|
|
1946
1954
|
}
|
1947
1955
|
break;
|
1948
1956
|
case 2:
|
1949
|
-
// line
|
1957
|
+
// line 689 "Parser.rl"
|
1950
1958
|
{
|
1951
1959
|
p--;
|
1952
1960
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1953
1961
|
}
|
1954
1962
|
break;
|
1955
|
-
// line
|
1963
|
+
// line 1964 "Parser.java"
|
1956
1964
|
}
|
1957
1965
|
}
|
1958
1966
|
}
|
@@ -1972,7 +1980,7 @@ case 5:
|
|
1972
1980
|
break; }
|
1973
1981
|
}
|
1974
1982
|
|
1975
|
-
// line
|
1983
|
+
// line 721 "Parser.rl"
|
1976
1984
|
|
1977
1985
|
if (cs < JSON_object_first_final) {
|
1978
1986
|
return null;
|
@@ -1998,7 +2006,7 @@ case 5:
|
|
1998
2006
|
}
|
1999
2007
|
|
2000
2008
|
|
2001
|
-
// line
|
2009
|
+
// line 2010 "Parser.java"
|
2002
2010
|
private static byte[] init__JSON_actions_0()
|
2003
2011
|
{
|
2004
2012
|
return new byte [] {
|
@@ -2102,7 +2110,7 @@ static final int JSON_error = 0;
|
|
2102
2110
|
static final int JSON_en_main = 1;
|
2103
2111
|
|
2104
2112
|
|
2105
|
-
// line
|
2113
|
+
// line 779 "Parser.rl"
|
2106
2114
|
|
2107
2115
|
|
2108
2116
|
public IRubyObject parse() {
|
@@ -2111,16 +2119,16 @@ static final int JSON_en_main = 1;
|
|
2111
2119
|
IRubyObject result = null;
|
2112
2120
|
|
2113
2121
|
|
2114
|
-
// line
|
2122
|
+
// line 2123 "Parser.java"
|
2115
2123
|
{
|
2116
2124
|
cs = JSON_start;
|
2117
2125
|
}
|
2118
2126
|
|
2119
|
-
// line
|
2127
|
+
// line 787 "Parser.rl"
|
2120
2128
|
p = byteList.begin();
|
2121
2129
|
pe = p + byteList.length();
|
2122
2130
|
|
2123
|
-
// line
|
2131
|
+
// line 2132 "Parser.java"
|
2124
2132
|
{
|
2125
2133
|
int _klen;
|
2126
2134
|
int _trans = 0;
|
@@ -2201,7 +2209,7 @@ case 1:
|
|
2201
2209
|
switch ( _JSON_actions[_acts++] )
|
2202
2210
|
{
|
2203
2211
|
case 0:
|
2204
|
-
// line
|
2212
|
+
// line 751 "Parser.rl"
|
2205
2213
|
{
|
2206
2214
|
currentNesting = 1;
|
2207
2215
|
ParserResult res = parseObject(p, pe);
|
@@ -2215,7 +2223,7 @@ case 1:
|
|
2215
2223
|
}
|
2216
2224
|
break;
|
2217
2225
|
case 1:
|
2218
|
-
// line
|
2226
|
+
// line 763 "Parser.rl"
|
2219
2227
|
{
|
2220
2228
|
currentNesting = 1;
|
2221
2229
|
ParserResult res = parseArray(p, pe);
|
@@ -2228,7 +2236,7 @@ case 1:
|
|
2228
2236
|
}
|
2229
2237
|
}
|
2230
2238
|
break;
|
2231
|
-
// line
|
2239
|
+
// line 2240 "Parser.java"
|
2232
2240
|
}
|
2233
2241
|
}
|
2234
2242
|
}
|
@@ -2248,7 +2256,7 @@ case 5:
|
|
2248
2256
|
break; }
|
2249
2257
|
}
|
2250
2258
|
|
2251
|
-
// line
|
2259
|
+
// line 790 "Parser.rl"
|
2252
2260
|
|
2253
2261
|
if (cs >= JSON_first_final && p == pe) {
|
2254
2262
|
return result;
|
data/java/src/json/ext/Parser.rl
CHANGED
@@ -596,7 +596,11 @@ public class Parser extends RubyObject {
|
|
596
596
|
fhold;
|
597
597
|
fbreak;
|
598
598
|
} else {
|
599
|
-
|
599
|
+
if (!parser.arrayClass.getName().equals("Array")) {
|
600
|
+
result.callMethod(context, "<<", res.result);
|
601
|
+
} else {
|
602
|
+
result.append(res.result);
|
603
|
+
}
|
600
604
|
fexec res.p;
|
601
605
|
}
|
602
606
|
}
|
@@ -655,7 +659,11 @@ public class Parser extends RubyObject {
|
|
655
659
|
fhold;
|
656
660
|
fbreak;
|
657
661
|
} else {
|
658
|
-
|
662
|
+
if (!parser.objectClass.getName().equals("Hash")) {
|
663
|
+
result.callMethod(context, "[]=", new IRubyObject[] { lastName, res.result });
|
664
|
+
} else {
|
665
|
+
result.op_aset(context, lastName, res.result);
|
666
|
+
}
|
659
667
|
fexec res.p;
|
660
668
|
}
|
661
669
|
}
|
data/json.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{json}
|
5
|
+
s.version = "1.5.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = [%q{Florian Frank}]
|
9
|
+
s.date = %q{2011-06-14}
|
10
|
+
s.description = %q{This is a JSON implementation as a Ruby extension in C.}
|
11
|
+
s.email = %q{flori@ping.de}
|
12
|
+
s.executables = [%q{edit_json.rb}, %q{prettify_json.rb}]
|
13
|
+
s.extensions = [%q{ext/json/ext/parser/extconf.rb}, %q{ext/json/ext/generator/extconf.rb}]
|
14
|
+
s.extra_rdoc_files = [%q{README.rdoc}]
|
15
|
+
s.files = [%q{tests}, %q{tests/test_json_string_matching.rb}, %q{tests/test_json_fixtures.rb}, %q{tests/setup_variant.rb}, %q{tests/fixtures}, %q{tests/fixtures/fail6.json}, %q{tests/fixtures/fail9.json}, %q{tests/fixtures/fail10.json}, %q{tests/fixtures/fail24.json}, %q{tests/fixtures/fail28.json}, %q{tests/fixtures/fail13.json}, %q{tests/fixtures/fail4.json}, %q{tests/fixtures/pass3.json}, %q{tests/fixtures/fail11.json}, %q{tests/fixtures/fail14.json}, %q{tests/fixtures/fail3.json}, %q{tests/fixtures/fail12.json}, %q{tests/fixtures/pass16.json}, %q{tests/fixtures/pass15.json}, %q{tests/fixtures/fail20.json}, %q{tests/fixtures/fail8.json}, %q{tests/fixtures/pass2.json}, %q{tests/fixtures/fail5.json}, %q{tests/fixtures/fail1.json}, %q{tests/fixtures/fail25.json}, %q{tests/fixtures/pass17.json}, %q{tests/fixtures/fail7.json}, %q{tests/fixtures/pass26.json}, %q{tests/fixtures/fail21.json}, %q{tests/fixtures/pass1.json}, %q{tests/fixtures/fail23.json}, %q{tests/fixtures/fail18.json}, %q{tests/fixtures/fail2.json}, %q{tests/fixtures/fail22.json}, %q{tests/fixtures/fail27.json}, %q{tests/fixtures/fail19.json}, %q{tests/test_json_unicode.rb}, %q{tests/test_json_addition.rb}, %q{tests/test_json_generate.rb}, %q{tests/test_json_encoding.rb}, %q{tests/test_json.rb}, %q{COPYING}, %q{TODO}, %q{Rakefile}, %q{benchmarks}, %q{benchmarks/data-p4-3GHz-ruby18}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat}, %q{benchmarks/parser2_benchmark.rb}, %q{benchmarks/parser_benchmark.rb}, %q{benchmarks/generator2_benchmark.rb}, %q{benchmarks/generator_benchmark.rb}, %q{benchmarks/ohai.ruby}, %q{benchmarks/data}, %q{benchmarks/ohai.json}, %q{lib}, %q{lib/json}, %q{lib/json/json.xpm}, %q{lib/json/TrueClass.xpm}, %q{lib/json/version.rb}, %q{lib/json/Array.xpm}, %q{lib/json/add}, %q{lib/json/add/core.rb}, %q{lib/json/add/rails.rb}, %q{lib/json/common.rb}, %q{lib/json/pure}, %q{lib/json/pure/generator.rb}, %q{lib/json/pure/parser.rb}, %q{lib/json/ext.rb}, %q{lib/json/pure.rb}, %q{lib/json/Key.xpm}, %q{lib/json/FalseClass.xpm}, %q{lib/json/editor.rb}, %q{lib/json/Numeric.xpm}, %q{lib/json/ext}, %q{lib/json/ext/1.9}, %q{lib/json/ext/1.8}, %q{lib/json/NilClass.xpm}, %q{lib/json/String.xpm}, %q{lib/json/Hash.xpm}, %q{lib/json.rb}, %q{README.rdoc}, %q{json_pure.gemspec}, %q{GPL}, %q{CHANGES}, %q{bin}, %q{bin/prettify_json.rb}, %q{bin/edit_json.rb}, %q{COPYING-json-jruby}, %q{ext}, %q{ext/json}, %q{ext/json/ext}, %q{ext/json/ext/parser}, %q{ext/json/ext/parser/parser.h}, %q{ext/json/ext/parser/extconf.rb}, %q{ext/json/ext/parser/parser.rl}, %q{ext/json/ext/parser/parser.c}, %q{ext/json/ext/generator}, %q{ext/json/ext/generator/generator.c}, %q{ext/json/ext/generator/extconf.rb}, %q{ext/json/ext/generator/generator.h}, %q{VERSION}, %q{data}, %q{data/prototype.js}, %q{data/index.html}, %q{data/example.json}, %q{json.gemspec}, %q{java}, %q{java/src}, %q{java/src/json}, %q{java/src/json/ext}, %q{java/src/json/ext/Parser.java}, %q{java/src/json/ext/RuntimeInfo.java}, %q{java/src/json/ext/GeneratorState.java}, %q{java/src/json/ext/OptionsReader.java}, %q{java/src/json/ext/ParserService.java}, %q{java/src/json/ext/Parser.rl}, %q{java/src/json/ext/StringEncoder.java}, %q{java/src/json/ext/GeneratorService.java}, %q{java/src/json/ext/Utils.java}, %q{java/src/json/ext/StringDecoder.java}, %q{java/src/json/ext/Generator.java}, %q{java/src/json/ext/ByteListTranscoder.java}, %q{java/src/json/ext/GeneratorMethods.java}, %q{java/lib}, %q{java/lib/bytelist-1.0.6.jar}, %q{java/lib/jcodings.jar}, %q{diagrams}, %q{README-json-jruby.markdown}, %q{install.rb}, %q{json-java.gemspec}, %q{tools}, %q{tools/fuzz.rb}, %q{tools/server.rb}, %q{./tests/test_json_string_matching.rb}, %q{./tests/test_json_fixtures.rb}, %q{./tests/test_json_unicode.rb}, %q{./tests/test_json_addition.rb}, %q{./tests/test_json_generate.rb}, %q{./tests/test_json_encoding.rb}, %q{./tests/test_json.rb}]
|
16
|
+
s.homepage = %q{http://flori.github.com/json}
|
17
|
+
s.rdoc_options = [%q{--title}, %q{JSON implemention for Ruby}, %q{--main}, %q{README.rdoc}]
|
18
|
+
s.require_paths = [%q{ext/json/ext}, %q{ext}, %q{lib}]
|
19
|
+
s.rubyforge_project = %q{json}
|
20
|
+
s.rubygems_version = %q{1.8.5}
|
21
|
+
s.summary = %q{JSON Implementation for Ruby}
|
22
|
+
s.test_files = [%q{./tests/test_json_string_matching.rb}, %q{./tests/test_json_fixtures.rb}, %q{./tests/test_json_unicode.rb}, %q{./tests/test_json_addition.rb}, %q{./tests/test_json_generate.rb}, %q{./tests/test_json_encoding.rb}, %q{./tests/test_json.rb}]
|
23
|
+
|
24
|
+
if s.respond_to? :specification_version then
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_development_dependency(%q<permutation>, [">= 0"])
|
29
|
+
s.add_development_dependency(%q<bullshit>, [">= 0"])
|
30
|
+
s.add_development_dependency(%q<sdoc>, [">= 0"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<permutation>, [">= 0"])
|
33
|
+
s.add_dependency(%q<bullshit>, [">= 0"])
|
34
|
+
s.add_dependency(%q<sdoc>, [">= 0"])
|
35
|
+
end
|
36
|
+
else
|
37
|
+
s.add_dependency(%q<permutation>, [">= 0"])
|
38
|
+
s.add_dependency(%q<bullshit>, [">= 0"])
|
39
|
+
s.add_dependency(%q<sdoc>, [">= 0"])
|
40
|
+
end
|
41
|
+
end
|
data/json_pure.gemspec
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{json_pure}
|
5
|
+
s.version = "1.5.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = [%q{Florian Frank}]
|
9
|
+
s.date = %q{2011-06-14}
|
10
|
+
s.description = %q{This is a JSON implementation in pure Ruby.}
|
11
|
+
s.email = %q{flori@ping.de}
|
12
|
+
s.executables = [%q{edit_json.rb}, %q{prettify_json.rb}]
|
13
|
+
s.extra_rdoc_files = [%q{README.rdoc}]
|
14
|
+
s.files = [%q{tests}, %q{tests/test_json_string_matching.rb}, %q{tests/test_json_fixtures.rb}, %q{tests/setup_variant.rb}, %q{tests/fixtures}, %q{tests/fixtures/fail6.json}, %q{tests/fixtures/fail9.json}, %q{tests/fixtures/fail10.json}, %q{tests/fixtures/fail24.json}, %q{tests/fixtures/fail28.json}, %q{tests/fixtures/fail13.json}, %q{tests/fixtures/fail4.json}, %q{tests/fixtures/pass3.json}, %q{tests/fixtures/fail11.json}, %q{tests/fixtures/fail14.json}, %q{tests/fixtures/fail3.json}, %q{tests/fixtures/fail12.json}, %q{tests/fixtures/pass16.json}, %q{tests/fixtures/pass15.json}, %q{tests/fixtures/fail20.json}, %q{tests/fixtures/fail8.json}, %q{tests/fixtures/pass2.json}, %q{tests/fixtures/fail5.json}, %q{tests/fixtures/fail1.json}, %q{tests/fixtures/fail25.json}, %q{tests/fixtures/pass17.json}, %q{tests/fixtures/fail7.json}, %q{tests/fixtures/pass26.json}, %q{tests/fixtures/fail21.json}, %q{tests/fixtures/pass1.json}, %q{tests/fixtures/fail23.json}, %q{tests/fixtures/fail18.json}, %q{tests/fixtures/fail2.json}, %q{tests/fixtures/fail22.json}, %q{tests/fixtures/fail27.json}, %q{tests/fixtures/fail19.json}, %q{tests/test_json_unicode.rb}, %q{tests/test_json_addition.rb}, %q{tests/test_json_generate.rb}, %q{tests/test_json_encoding.rb}, %q{tests/test_json.rb}, %q{COPYING}, %q{TODO}, %q{Rakefile}, %q{benchmarks}, %q{benchmarks/data-p4-3GHz-ruby18}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat}, %q{benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat}, %q{benchmarks/parser2_benchmark.rb}, %q{benchmarks/parser_benchmark.rb}, %q{benchmarks/generator2_benchmark.rb}, %q{benchmarks/generator_benchmark.rb}, %q{benchmarks/ohai.ruby}, %q{benchmarks/data}, %q{benchmarks/ohai.json}, %q{lib}, %q{lib/json}, %q{lib/json/json.xpm}, %q{lib/json/TrueClass.xpm}, %q{lib/json/version.rb}, %q{lib/json/Array.xpm}, %q{lib/json/add}, %q{lib/json/add/core.rb}, %q{lib/json/add/rails.rb}, %q{lib/json/common.rb}, %q{lib/json/pure}, %q{lib/json/pure/generator.rb}, %q{lib/json/pure/parser.rb}, %q{lib/json/ext.rb}, %q{lib/json/pure.rb}, %q{lib/json/Key.xpm}, %q{lib/json/FalseClass.xpm}, %q{lib/json/editor.rb}, %q{lib/json/Numeric.xpm}, %q{lib/json/ext}, %q{lib/json/ext/1.9}, %q{lib/json/ext/1.8}, %q{lib/json/NilClass.xpm}, %q{lib/json/String.xpm}, %q{lib/json/Hash.xpm}, %q{lib/json.rb}, %q{README.rdoc}, %q{json_pure.gemspec}, %q{GPL}, %q{CHANGES}, %q{bin}, %q{bin/prettify_json.rb}, %q{bin/edit_json.rb}, %q{COPYING-json-jruby}, %q{ext}, %q{ext/json}, %q{ext/json/ext}, %q{ext/json/ext/parser}, %q{ext/json/ext/parser/parser.h}, %q{ext/json/ext/parser/extconf.rb}, %q{ext/json/ext/parser/parser.rl}, %q{ext/json/ext/parser/parser.c}, %q{ext/json/ext/generator}, %q{ext/json/ext/generator/generator.c}, %q{ext/json/ext/generator/extconf.rb}, %q{ext/json/ext/generator/generator.h}, %q{VERSION}, %q{data}, %q{data/prototype.js}, %q{data/index.html}, %q{data/example.json}, %q{json.gemspec}, %q{java}, %q{java/src}, %q{java/src/json}, %q{java/src/json/ext}, %q{java/src/json/ext/Parser.java}, %q{java/src/json/ext/RuntimeInfo.java}, %q{java/src/json/ext/GeneratorState.java}, %q{java/src/json/ext/OptionsReader.java}, %q{java/src/json/ext/ParserService.java}, %q{java/src/json/ext/Parser.rl}, %q{java/src/json/ext/StringEncoder.java}, %q{java/src/json/ext/GeneratorService.java}, %q{java/src/json/ext/Utils.java}, %q{java/src/json/ext/StringDecoder.java}, %q{java/src/json/ext/Generator.java}, %q{java/src/json/ext/ByteListTranscoder.java}, %q{java/src/json/ext/GeneratorMethods.java}, %q{java/lib}, %q{java/lib/bytelist-1.0.6.jar}, %q{java/lib/jcodings.jar}, %q{diagrams}, %q{README-json-jruby.markdown}, %q{install.rb}, %q{json-java.gemspec}, %q{tools}, %q{tools/fuzz.rb}, %q{tools/server.rb}, %q{./tests/test_json_string_matching.rb}, %q{./tests/test_json_fixtures.rb}, %q{./tests/test_json_unicode.rb}, %q{./tests/test_json_addition.rb}, %q{./tests/test_json_generate.rb}, %q{./tests/test_json_encoding.rb}, %q{./tests/test_json.rb}]
|
15
|
+
s.homepage = %q{http://flori.github.com/json}
|
16
|
+
s.rdoc_options = [%q{--title}, %q{JSON implemention for ruby}, %q{--main}, %q{README.rdoc}]
|
17
|
+
s.require_paths = [%q{lib}]
|
18
|
+
s.rubyforge_project = %q{json}
|
19
|
+
s.rubygems_version = %q{1.8.5}
|
20
|
+
s.summary = %q{JSON Implementation for Ruby}
|
21
|
+
s.test_files = [%q{./tests/test_json_string_matching.rb}, %q{./tests/test_json_fixtures.rb}, %q{./tests/test_json_unicode.rb}, %q{./tests/test_json_addition.rb}, %q{./tests/test_json_generate.rb}, %q{./tests/test_json_encoding.rb}, %q{./tests/test_json.rb}]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
s.specification_version = 3
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_development_dependency(%q<permutation>, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<bullshit>, [">= 0"])
|
29
|
+
s.add_development_dependency(%q<sdoc>, [">= 0"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<permutation>, [">= 0"])
|
32
|
+
s.add_dependency(%q<bullshit>, [">= 0"])
|
33
|
+
s.add_dependency(%q<sdoc>, [">= 0"])
|
34
|
+
end
|
35
|
+
else
|
36
|
+
s.add_dependency(%q<permutation>, [">= 0"])
|
37
|
+
s.add_dependency(%q<bullshit>, [">= 0"])
|
38
|
+
s.add_dependency(%q<sdoc>, [">= 0"])
|
39
|
+
end
|
40
|
+
end
|
data/lib/json.rb
CHANGED
@@ -1,3 +1,55 @@
|
|
1
|
+
##
|
2
|
+
# = JavaScript Object Notation (JSON)
|
3
|
+
#
|
4
|
+
# JSON is a lightweight data-interchange format. It is easy for us
|
5
|
+
# humans to read and write. Plus, equally simple for machines to generate or parse.
|
6
|
+
# JSON is completely language agnostic, making it the ideal interchange format.
|
7
|
+
#
|
8
|
+
# Built on two universally available structures:
|
9
|
+
# 1. A collection of name/value pairs. Often referred to as an _object_, hash table, record, struct, keyed list, or associative array.
|
10
|
+
# 2. An orderd list of values. More commonly named as an _array_, vector, sequence, or list.
|
11
|
+
#
|
12
|
+
# To read more about JSON visit: http://json.org
|
13
|
+
#
|
14
|
+
# == Parsing JSON
|
15
|
+
#
|
16
|
+
# To parse a JSON string received by another application, or generated within
|
17
|
+
# your existing application:
|
18
|
+
#
|
19
|
+
# require 'json'
|
20
|
+
#
|
21
|
+
# my_hash = JSON.parse('{"hello": "goodbye"}')
|
22
|
+
# puts my_hash["hello"] => "goodbye"
|
23
|
+
#
|
24
|
+
# Notice the extra quotes <tt>''</tt> around the hash notation. Ruby expects
|
25
|
+
# the argument to be a string and can't convert objects like a hash or array.
|
26
|
+
#
|
27
|
+
# Ruby converts your string into a hash
|
28
|
+
#
|
29
|
+
# == Generating JSON
|
30
|
+
#
|
31
|
+
# Creating a JSON string for communication or serialization is
|
32
|
+
# just as simple.
|
33
|
+
#
|
34
|
+
# require 'json'
|
35
|
+
#
|
36
|
+
# my_hash = {:hello => "goodbye"}
|
37
|
+
# puts JSON.generate(my_hash) => "{\"hello\":\"goodbye\"}"
|
38
|
+
#
|
39
|
+
# Or an alternative way:
|
40
|
+
#
|
41
|
+
# require 'json'
|
42
|
+
# puts {:hello => "goodbye"}.to_json => "{\"hello\":\"goodbye\"}"
|
43
|
+
#
|
44
|
+
# <tt>JSON.generate</tt> only allows objects or arrays to be converted
|
45
|
+
# to JSON syntax. While <tt>to_json</tt> accepts many Ruby classes
|
46
|
+
# even though it only acts a method for serialization:
|
47
|
+
#
|
48
|
+
# require 'json'
|
49
|
+
#
|
50
|
+
# 1.to_json => "1"
|
51
|
+
#
|
52
|
+
|
1
53
|
require 'json/common'
|
2
54
|
module JSON
|
3
55
|
require 'json/version'
|