jrjackson 0.2.3 → 0.2.4

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -19
  3. data/benchmarking/fixtures/bench_options.rb +4 -0
  4. data/benchmarking/individual/gson-gen-jr-sourced.rb +1 -1
  5. data/benchmarking/individual/gson-jr-sourced.rb +1 -1
  6. data/benchmarking/individual/json-gen-jr-sourced.rb +1 -1
  7. data/benchmarking/individual/json-gen-mri-sourced.rb +1 -1
  8. data/benchmarking/individual/json-jr-sourced.rb +1 -1
  9. data/benchmarking/individual/json-mri-sourced.rb +1 -1
  10. data/benchmarking/individual/oj-gen-mri-sourced.rb +1 -1
  11. data/benchmarking/individual/oj-mri-sourced.rb +1 -1
  12. data/benchmarking/individual/raw-bd-jr-sourced.rb +1 -1
  13. data/benchmarking/individual/raw-gen-jr-sourced.rb +1 -1
  14. data/benchmarking/individual/raw-jr-sourced.rb +1 -1
  15. data/benchmarking/individual/str-bd-jr-sourced.rb +1 -1
  16. data/benchmarking/individual/string-jr-sourced.rb +1 -1
  17. data/benchmarking/individual/sym-bd-jr-sourced.rb +1 -1
  18. data/benchmarking/individual/symbol-jr-sourced.rb +1 -1
  19. data/dependency-reduced-pom.xml +2 -2
  20. data/lib/jrjackson/jars/jrjackson-1.2.6.jar +0 -0
  21. data/lib/jrjackson/jrjackson.rb +3 -3
  22. data/lib/jrjackson/version.rb +1 -1
  23. data/pom.xml +2 -2
  24. data/run_all_individual_bench.sh +8 -8
  25. data/src/main/java/com/jrjackson/JrJacksonRaw.java +26 -49
  26. data/src/main/java/com/jrjackson/RubyJacksonModule.java +26 -22
  27. data/src/main/java/com/jrjackson/RubyKeyConverter.java +1 -1
  28. data/src/main/java/com/jrjackson/RubyObjectDeserializer.java +30 -28
  29. data/src/main/java/com/jrjackson/RubyStringConverter.java +2 -2
  30. data/src/main/java/com/jrjackson/RubySymbolConverter.java +2 -2
  31. data/test/jrjackson_test.rb +7 -0
  32. metadata +2 -2
  33. data/lib/jrjackson/jars/jrjackson-1.2.4.jar +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff0d3008ed2be467a14efa7ce22f17b798aff14f
4
- data.tar.gz: 29acde65d94012d051d9ccd24dda9dfb4187cc6b
3
+ metadata.gz: dbc02833dd5b438dabc8a6e6c3b0a42e9fcd4cca
4
+ data.tar.gz: 3d86d6411ee599ac5ea84c1d7ec0eadfb07b825a
5
5
  SHA512:
6
- metadata.gz: 49cad8b054b626adebd9d6a504b4b2d99df08a685f575d034e0ff957c772ee7f6c4bd2ceeec28b6ac41008f6877b54d95470d8de094a961a4dd3ec20bd3c63cd
7
- data.tar.gz: a2f153ba800e763d4774473beeda5a3861b83303ec1fdd743a5751dc897a97df9796438044f08a45f880f464da67a15b8231d874d5fcbd25af49e30dc88fa026
6
+ metadata.gz: 6560285bd96536a57d0fcf723ef9ead449a1cc07514cf80cb12d6cfe4d475e042d8e5c66b9fd257348a94dc1cdcf4f47b886bc3fe76cd29cbae323910126733a
7
+ data.tar.gz: 4e6b988dd92ddf09181f4a3ff687be04eb2221fd71746c5859a9734e50cafba24fce6e9ffc200d0f0dc284f826f5851b577937c511d2a50d2079abdbdfab8e64
data/README.md CHANGED
@@ -77,33 +77,34 @@ Credit to Chuck Remes for the benchmark and initial
77
77
  investigation when the jruby, json gem and the jackson
78
78
  libraries were young.
79
79
 
80
- I compared Json (java) 1.8, Gson 0.6.1 and jackson 2.2.3 on jruby 1.7.4 and OpenJDK 64-Bit Server VM 1.7.0_21-b02
80
+ I compared Json (java) 1.8, Gson 0.6.1 and jackson 2.2.3 on jruby 1.7.5 and OpenJDK 64-Bit Server VM 1.7.0_25-b30
81
81
  All the benchmarks were run separately. A 727.9KB string of random json data is read from a file and handled 250 times, thereby attempting to balance invocation and parsing benchmarking.
82
82
 
83
83
  ```
84
84
  generation/serialize
85
85
 
86
- user system total real
87
- json mri generate: 250 12.02 0.00 12.02 ( 12.022)
88
- oj mri generate: 250 7.18 0.00 7.18 ( 7.183)
89
- json java generate: 250 7.83 0.01 7.84 ( 7.289)
90
- gson generate: 250 5.04 0.00 5.04 ( 4.995)
91
- jackson generate: 250 4.94 0.08 5.02 ( 4.811)
86
+ user system total real
87
+ json mri generate: 250 12.02 0.00 12.02 ( 12.022)
88
+ oj mri generate: 250 7.18 0.00 7.18 ( 7.183)
89
+ json java generate: 250 7.83 0.01 7.84 ( 7.289)
90
+ gson generate: 250 5.04 0.00 5.04 ( 4.995)
91
+ jackson generate: 250 4.94 0.08 5.02 ( 4.811)
92
+ jackson generate: 250 4.85 0.04 4.89 ( 4.758)
92
93
 
93
94
 
94
95
  parsing/deserialize - after jrjackson parsing profiling
95
96
 
96
- user system total real
97
- json mri parse: 250 8.35 0.02 8.37 ( 8.366)
98
- oj mri parse: 250 6.10 0.13 6.23 ( 7.527)
99
-
100
- gson parse: 250 12.02 0.02 12.04 ( 11.774)
101
- json java parse: 250 10.35 0.01 10.36 ( 10.204)
102
- jackson parse string keys: 250 6.27 0.02 6.29 ( 6.010)
103
- jackson parse string + bigdecimal: 250 6.27 0.00 6.27 ( 5.973)
104
- jackson parse symbol keys: 250 5.16 0.00 5.16 ( 4.873)
105
- jackson parse symbol + bigdecimal: 250 4.75 0.06 4.81 ( 4.461)
106
- jackson parse raw: 250 3.23 0.05 3.28 ( 3.021)
107
- jackson parse raw + bigdecimal: 250 3.06 0.06 3.12 ( 2.639)
97
+ user system total real
98
+ json mri parse: 250 8.35 0.02 8.37 ( 8.366)
99
+ oj mri parse: 250 6.10 0.13 6.23 ( 7.527)
100
+
101
+ gson parse: 250 12.02 0.02 12.04 ( 11.774)
102
+ json java parse: 250 10.35 0.01 10.36 ( 10.204)
103
+ jackson parse string keys: 250 5.60 0.00 5.60 ( 5.356)
104
+ jackson parse string + bigdecimal: 250 5.14 0.01 5.15 ( 4.946)
105
+ jackson parse symbol keys: 250 4.16 0.01 4.17 ( 3.989)
106
+ jackson parse symbol + bigdecimal: 250 3.90 0.03 3.93 ( 3.597)
107
+ jackson parse raw: 250 3.08 0.01 3.09 ( 2.924)
108
+ jackson parse raw + bigdecimal: 250 2.70 0.06 2.76 ( 2.493)
108
109
 
109
110
  ```
@@ -11,4 +11,8 @@ module BenchOptions
11
11
  def source
12
12
  "benchmarking/fixtures/source#{CURRENT}.json"
13
13
  end
14
+
15
+ def output_width
16
+ 44
17
+ end
14
18
  end
@@ -8,7 +8,7 @@ require File.expand_path('benchmarking/fixtures/bench_options')
8
8
  filename = File.expand_path(BenchOptions.source)
9
9
  hsh = JrJackson::Json.load(File.read(filename), use_bigdecimal: false, symbolize_keys: true)
10
10
 
11
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
11
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
12
12
  x.report("gson generate: #{BenchOptions.iterations}") do
13
13
  BenchOptions.iterations.times { ::Gson::Encoder.new({}).encode(hsh) }
14
14
  end
@@ -7,7 +7,7 @@ filename = File.expand_path(BenchOptions.source)
7
7
 
8
8
  dumped_string = File.read(filename)
9
9
 
10
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
10
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
11
11
  x.report("gson parse: #{BenchOptions.iterations}") do
12
12
  BenchOptions.iterations.times { ::Gson::Decoder.new({}).decode(dumped_string) }
13
13
  end
@@ -8,7 +8,7 @@ require File.expand_path('benchmarking/fixtures/bench_options')
8
8
  filename = File.expand_path(BenchOptions.source)
9
9
  hsh = JSON.parse(File.read(filename))
10
10
 
11
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
11
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
12
12
  x.report("json java generate: #{BenchOptions.iterations}") do
13
13
  BenchOptions.iterations.times { JSON.generate(hsh) }
14
14
  end
@@ -9,7 +9,7 @@ filename = File.expand_path(BenchOptions.source)
9
9
  JSON.parser = JSON::Ext::Parser
10
10
  hsh = JSON.parse(File.read(filename))
11
11
 
12
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
12
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
13
13
  x.report("json mri generate: #{BenchOptions.iterations}") do
14
14
  BenchOptions.iterations.times { JSON.fast_generate(hsh) }
15
15
  end
@@ -7,7 +7,7 @@ filename = File.expand_path(BenchOptions.source)
7
7
 
8
8
  dumped_string = File.read(filename)
9
9
 
10
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
10
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
11
11
  x.report("json java parse: #{BenchOptions.iterations}") do
12
12
  BenchOptions.iterations.times { ::JSON.parse(dumped_string) }
13
13
  end
@@ -8,7 +8,7 @@ filename = File.expand_path(BenchOptions.source)
8
8
 
9
9
  dumped_string = File.read(filename)
10
10
 
11
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
11
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
12
12
  x.report("json mri parse: #{BenchOptions.iterations}") do
13
13
  BenchOptions.iterations.times { JSON::Ext::Parser.new(dumped_string).parse }
14
14
  end
@@ -6,7 +6,7 @@ require File.expand_path('benchmarking/fixtures/bench_options')
6
6
  filename = File.expand_path(BenchOptions.source)
7
7
  hsh = Oj.compat_load(File.read(filename))
8
8
 
9
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
9
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
10
10
  x.report("oj mri generate: #{BenchOptions.iterations}") do
11
11
  BenchOptions.iterations.times { Oj.dump(hsh) }
12
12
  end
@@ -7,7 +7,7 @@ filename = File.expand_path(BenchOptions.source)
7
7
 
8
8
  dumped_string = File.read(filename)
9
9
 
10
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
10
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
11
11
  x.report("oj mri parse: #{BenchOptions.iterations}") do
12
12
  BenchOptions.iterations.times { Oj.compat_load(dumped_string) }
13
13
  end
@@ -9,7 +9,7 @@ filename = File.expand_path(BenchOptions.source)
9
9
  opts = {use_bigdecimal: true, raw: true}
10
10
  dumped_string = File.read(filename)
11
11
 
12
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
12
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
13
13
  x.report("jackson parse raw + bigdecimal: #{BenchOptions.iterations}") do
14
14
  BenchOptions.iterations.times { JrJackson::Json.load(dumped_string, opts) }
15
15
  end
@@ -7,7 +7,7 @@ require File.expand_path('benchmarking/fixtures/bench_options')
7
7
  filename = File.expand_path(BenchOptions.source)
8
8
  hsh = JrJackson::Json.load(File.read(filename), use_bigdecimal: false, symbolize_keys: true)
9
9
 
10
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
10
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
11
11
  x.report("jackson generate: #{BenchOptions.iterations}") do
12
12
  BenchOptions.iterations.times { JrJackson::Raw.generate(hsh) }
13
13
  end
@@ -9,7 +9,7 @@ filename = File.expand_path(BenchOptions.source)
9
9
  opts = {raw: true}
10
10
  dumped_string = File.read(filename)
11
11
 
12
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
12
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
13
13
  x.report("jackson parse raw: #{BenchOptions.iterations}") do
14
14
  BenchOptions.iterations.times { JrJackson::Json.load(dumped_string, opts) }
15
15
  end
@@ -9,7 +9,7 @@ filename = File.expand_path(BenchOptions.source)
9
9
  opts = {use_bigdecimal: true}
10
10
  dumped_string = File.read(filename)
11
11
 
12
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
12
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
13
13
  x.report("jackson parse string + bigdecimal: #{BenchOptions.iterations}") do
14
14
  BenchOptions.iterations.times { JrJackson::Json.load(dumped_string, opts) }
15
15
  end
@@ -9,7 +9,7 @@ filename = File.expand_path(BenchOptions.source)
9
9
  opts = nil
10
10
  dumped_string = File.read(filename)
11
11
 
12
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
12
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
13
13
  x.report("jackson parse string keys: #{BenchOptions.iterations}") do
14
14
  BenchOptions.iterations.times { JrJackson::Json.load(dumped_string, opts) }
15
15
  end
@@ -9,7 +9,7 @@ filename = File.expand_path(BenchOptions.source)
9
9
  opts = {use_bigdecimal: true, symbolize_keys: true}
10
10
  dumped_string = File.read(filename)
11
11
 
12
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
12
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
13
13
  x.report("jackson parse symbol + bigdecimal: #{BenchOptions.iterations}") do
14
14
  BenchOptions.iterations.times { JrJackson::Json.load(dumped_string, opts) }
15
15
  end
@@ -9,7 +9,7 @@ filename = File.expand_path(BenchOptions.source)
9
9
  opts = {use_bigdecimal: false, symbolize_keys: true}
10
10
  dumped_string = File.read(filename)
11
11
 
12
- Benchmark.bmbm("jackson parse symbol + bigdecimal: ".size) do |x|
12
+ Benchmark.bmbm(BenchOptions.output_width) do |x|
13
13
  x.report("jackson parse symbol keys: #{BenchOptions.iterations}") do
14
14
  BenchOptions.iterations.times { JrJackson::Json.load(dumped_string, opts) }
15
15
  end
@@ -4,7 +4,7 @@
4
4
  <groupId>com.jrjackson.jruby</groupId>
5
5
  <artifactId>jrjackson</artifactId>
6
6
  <name>jrjackson</name>
7
- <version>1.2.4</version>
7
+ <version>1.2.6</version>
8
8
  <url>http://maven.apache.org</url>
9
9
  <build>
10
10
  <plugins>
@@ -65,7 +65,7 @@
65
65
  <dependency>
66
66
  <groupId>org.jruby</groupId>
67
67
  <artifactId>jruby</artifactId>
68
- <version>1.7.4</version>
68
+ <version>1.7.5</version>
69
69
  <scope>compile</scope>
70
70
  </dependency>
71
71
  </dependencies>
@@ -3,8 +3,8 @@ unless RUBY_PLATFORM =~ /java/
3
3
  exit 255
4
4
  end
5
5
 
6
- require_relative "jars/jrjackson-1.2.4.jar"
7
- # require_relative "linked/jrjackson-1.2.4.jar"
6
+ require_relative "jars/jrjackson-1.2.6.jar"
7
+ # require_relative "linked/jrjackson-1.2.6.jar"
8
8
 
9
9
  require 'com/jrjackson/jr_jackson'
10
10
 
@@ -33,7 +33,7 @@ module JrJackson
33
33
 
34
34
  def dump(object)
35
35
  case object
36
- when Array, Hash, String
36
+ when Array, Hash, String, Java::JavaUtil::LinkedHashMap
37
37
  JrJackson::Raw.generate(object)
38
38
  when true, false
39
39
  object.to_s
@@ -1,3 +1,3 @@
1
1
  module JrJackson
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.4'
3
3
  end
data/pom.xml CHANGED
@@ -5,7 +5,7 @@
5
5
  <groupId>com.jrjackson.jruby</groupId>
6
6
  <artifactId>jrjackson</artifactId>
7
7
  <packaging>jar</packaging>
8
- <version>1.2.4</version>
8
+ <version>1.2.6</version>
9
9
  <name>jrjackson</name>
10
10
  <url>http://maven.apache.org</url>
11
11
 
@@ -23,7 +23,7 @@
23
23
  <dependency>
24
24
  <groupId>org.jruby</groupId>
25
25
  <artifactId>jruby</artifactId>
26
- <version>1.7.4</version>
26
+ <version>1.7.5</version>
27
27
  </dependency>
28
28
  <dependency>
29
29
  <groupId>com.fasterxml.jackson.core</groupId>
@@ -1,10 +1,10 @@
1
1
  #!/bin/sh
2
2
 
3
- ruby benchmarking/individual/json-mri-sourced.rb
4
- ruby benchmarking/individual/oj-mri-sourced.rb
3
+ # ruby benchmarking/individual/json-mri-sourced.rb
4
+ # ruby benchmarking/individual/oj-mri-sourced.rb
5
5
 
6
- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-jr-sourced.rb
7
- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-jr-sourced.rb
6
+ # jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-jr-sourced.rb
7
+ # jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-jr-sourced.rb
8
8
 
9
9
  jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/string-jr-sourced.rb
10
10
  jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/str-bd-jr-sourced.rb
@@ -15,9 +15,9 @@ jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/sym-bd-jr-sourc
15
15
  jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-jr-sourced.rb
16
16
  jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-bd-jr-sourced.rb
17
17
 
18
- ruby benchmarking/individual/json-gen-mri-sourced.rb
19
- ruby benchmarking/individual/oj-gen-mri-sourced.rb
18
+ # ruby benchmarking/individual/json-gen-mri-sourced.rb
19
+ # ruby benchmarking/individual/oj-gen-mri-sourced.rb
20
20
 
21
- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-gen-jr-sourced.rb
22
- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-gen-jr-sourced.rb
21
+ # jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-gen-jr-sourced.rb
22
+ # jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-gen-jr-sourced.rb
23
23
  jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-gen-jr-sourced.rb
@@ -25,38 +25,13 @@ import com.fasterxml.jackson.core.JsonProcessingException;
25
25
 
26
26
  @JRubyModule(name = "JrJacksonRaw")
27
27
  public class JrJacksonRaw extends RubyObject {
28
- private static final HashMap<String, ObjectMapper> mappers = new HashMap<String, ObjectMapper>(3);
29
- private static final HashMap<String, RubySymbol> symbols = new HashMap<String, RubySymbol>(3);
30
-
31
- private static final Ruby _ruby = Ruby.getGlobalRuntime();
32
-
33
- static {
34
- mappers.put("str",
35
- RubyJacksonModule.mappedAs("str")
36
- );
37
- mappers.put("sym",
38
- RubyJacksonModule.mappedAs("sym")
39
- );
40
- mappers.put("raw",
41
- RubyJacksonModule.mappedAs("raw")
42
- );
43
- symbols.put("sym",
44
- RubyUtils.rubySymbol(_ruby, "symbolize_keys")
45
- );
46
- symbols.put("raw",
47
- RubyUtils.rubySymbol(_ruby, "raw")
48
- );
49
- symbols.put("bigdecimal",
50
- RubyUtils.rubySymbol(_ruby, "use_bigdecimal")
51
- );
52
- }
53
28
 
54
29
  public JrJacksonRaw(Ruby ruby, RubyClass metaclass) {
55
30
  super(ruby, metaclass);
56
31
  }
57
32
 
58
- private static boolean flagged(RubyHash opts, String key) {
59
- Object val = opts.get(symbols.get(key));
33
+ private static boolean flagged(RubyHash opts, RubySymbol key) {
34
+ Object val = opts.get(key);
60
35
  if (val == null) {
61
36
  return false;
62
37
  }
@@ -69,19 +44,21 @@ public class JrJacksonRaw extends RubyObject {
69
44
  throws IOException
70
45
  {
71
46
  RubyHash options = null;
72
- String key = "str";
73
- ObjectMapper local;
47
+ ObjectMapper local = null;
48
+ Ruby _ruby = context.getRuntime();
74
49
 
75
50
  if (opts != context.nil) {
76
51
  options = opts.convertToHash();
77
- if (flagged(options, "sym")) {
78
- key = "sym";
52
+ if (flagged(options, RubyUtils.rubySymbol(_ruby, "symbolize_keys"))) {
53
+ local = RubyJacksonModule.mappedAs("sym", _ruby);
79
54
  }
80
- if (flagged(options, "raw")) {
81
- key = "raw";
55
+ if (flagged(options, RubyUtils.rubySymbol(_ruby, "raw"))) {
56
+ local = RubyJacksonModule.mappedAs("raw", _ruby);
82
57
  }
83
- local = mappers.get(key).copy();
84
- if (flagged(options, "bigdecimal")) {
58
+ if (local == null) {
59
+ local = RubyJacksonModule.mappedAs("str", _ruby);
60
+ }
61
+ if (flagged(options, RubyUtils.rubySymbol(_ruby, "use_bigdecimal"))) {
85
62
  local.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
86
63
  }
87
64
  else {
@@ -89,7 +66,7 @@ public class JrJacksonRaw extends RubyObject {
89
66
  }
90
67
  }
91
68
  else {
92
- local = mappers.get(key).copy();
69
+ local = RubyJacksonModule.mappedAs("str", _ruby);
93
70
  }
94
71
  return _parse(context, arg, local);
95
72
  }
@@ -98,28 +75,30 @@ public class JrJacksonRaw extends RubyObject {
98
75
  public static IRubyObject parse_raw(ThreadContext context, IRubyObject self, IRubyObject arg)
99
76
  throws IOException
100
77
  {
101
- return _parse(context, arg, mappers.get("raw"));
78
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("raw", context.getRuntime());
79
+ return _parse(context, arg, mapper);
102
80
  }
103
81
 
104
82
  @JRubyMethod(module = true, name = {"parse_sym", "load_sym"}, required = 1)
105
83
  public static IRubyObject parse_sym(ThreadContext context, IRubyObject self, IRubyObject arg)
106
84
  throws IOException
107
85
  {
108
- return _parse(context, arg, mappers.get("sym"));
86
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("sym", context.getRuntime());
87
+ return _parse(context, arg, mapper);
109
88
  }
110
89
 
111
90
  @JRubyMethod(module = true, name = {"parse_str", "load_str"}, required = 1)
112
91
  public static IRubyObject parse_str(ThreadContext context, IRubyObject self, IRubyObject arg)
113
92
  throws IOException
114
93
  {
115
- return _parse(context, arg, mappers.get("str"));
94
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("str", context.getRuntime());
95
+ return _parse(context, arg, mapper);
116
96
  }
117
97
 
118
- public static IRubyObject _parse(ThreadContext context, IRubyObject arg, ObjectMapper mapper)
98
+ private static IRubyObject _parse(ThreadContext context, IRubyObject arg, ObjectMapper mapper)
119
99
  throws IOException
120
100
  {
121
101
  Ruby ruby = context.getRuntime();
122
-
123
102
  try {
124
103
  Object o;
125
104
  if (arg instanceof RubyString) {
@@ -147,20 +126,18 @@ public class JrJacksonRaw extends RubyObject {
147
126
  public static IRubyObject generate(ThreadContext context, IRubyObject self, IRubyObject arg)
148
127
  throws IOException, JsonProcessingException
149
128
  {
150
- Ruby ruby = context.getRuntime();
129
+ Ruby _ruby = context.getRuntime();
151
130
  Object obj = arg.toJava(Object.class);
152
- // String s = mappers.get("raw").writeValueAsString(obj);
153
- // return RubyUtils.rubyString(ruby, s);
154
-
155
131
  try {
156
- String s = mappers.get("raw").writeValueAsString(obj);
157
- return RubyUtils.rubyString(ruby, s);
132
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("raw", _ruby);
133
+ String s = mapper.writeValueAsString(obj);
134
+ return RubyUtils.rubyString(_ruby, s);
158
135
  }
159
136
  catch (JsonProcessingException e) {
160
- throw ParseError.newParseError(ruby, e.getLocalizedMessage());
137
+ throw ParseError.newParseError(_ruby, e.getLocalizedMessage());
161
138
  }
162
139
  catch (IOException e) {
163
- throw ruby.newIOError(e.getLocalizedMessage());
140
+ throw _ruby.newIOError(e.getLocalizedMessage());
164
141
  }
165
142
  }
166
143
  }
@@ -4,7 +4,6 @@ import java.util.*;
4
4
  import java.text.SimpleDateFormat;
5
5
 
6
6
  import org.jruby.*;
7
- // import org.jruby.util.RubyDateFormat;
8
7
 
9
8
  import com.fasterxml.jackson.databind.ObjectMapper;
10
9
  import com.fasterxml.jackson.databind.module.SimpleModule;
@@ -17,32 +16,39 @@ import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
17
16
  public class RubyJacksonModule extends SimpleModule
18
17
  {
19
18
 
19
+ private static final ObjectMapper static_mapper = new ObjectMapper().registerModule(
20
+ new RubyJacksonModule().addSerializer(RubyObject.class, RubyAnySerializer.instance)
21
+ );
22
+
23
+ static {
24
+ static_mapper.registerModule(new AfterburnerModule());
25
+ static_mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
26
+ static_mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"));
27
+ }
28
+
20
29
  private RubyJacksonModule()
21
30
  {
22
31
  super("JrJacksonStrModule", VersionUtil.versionFor(RubyJacksonModule.class));
23
32
  }
24
33
 
25
- public static ObjectMapper mappedAs(String key)
34
+ public static ObjectMapper mappedAs(String key, Ruby ruby)
26
35
  {
27
- ObjectMapper mapper = new ObjectMapper();
28
-
29
- mapper.registerModule(
36
+ if (key == "raw") {
37
+ return static_mapper;
38
+ }
39
+
40
+ ObjectMapper mapper = new ObjectMapper().registerModule(
30
41
  new AfterburnerModule()
31
42
  );
32
43
 
33
44
  if (key == "sym") {
34
45
  mapper.registerModule(
35
- asSym()
36
- );
37
- }
38
- else if (key == "raw") {
39
- mapper.registerModule(
40
- asRaw()
46
+ asSym(ruby)
41
47
  );
42
48
  }
43
49
  else {
44
50
  mapper.registerModule(
45
- asStr()
51
+ asStr(ruby)
46
52
  );
47
53
  }
48
54
  mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -50,28 +56,26 @@ public class RubyJacksonModule extends SimpleModule
50
56
  return mapper;
51
57
  }
52
58
 
53
- public static SimpleModule asRaw()
54
- {
55
- return new RubyJacksonModule().addSerializer(
56
- RubyObject.class, RubyAnySerializer.instance
57
- );
58
- }
59
+ // public static SimpleModule asRaw()
60
+ // {
61
+ // return static_mapper;
62
+ // }
59
63
 
60
- public static SimpleModule asSym()
64
+ public static SimpleModule asSym(Ruby ruby)
61
65
  {
62
66
  return new RubyJacksonModule().addSerializer(
63
67
  RubyObject.class, RubyAnySerializer.instance
64
68
  ).addDeserializer(
65
- Object.class, new RubyObjectDeserializer().setSymbolStrategy()
69
+ Object.class, new RubyObjectDeserializer().withRuby(ruby).setSymbolStrategy()
66
70
  );
67
71
  }
68
72
 
69
- public static SimpleModule asStr()
73
+ public static SimpleModule asStr(Ruby ruby)
70
74
  {
71
75
  return new RubyJacksonModule().addSerializer(
72
76
  RubyObject.class, RubyAnySerializer.instance
73
77
  ).addDeserializer(
74
- Object.class, new RubyObjectDeserializer().setStringStrategy()
78
+ Object.class, new RubyObjectDeserializer().withRuby(ruby).setStringStrategy()
75
79
  );
76
80
  }
77
81
  }
@@ -8,5 +8,5 @@ import org.jruby.RubyObject;
8
8
 
9
9
  public interface RubyKeyConverter
10
10
  {
11
- public RubyObject convert(JsonParser jp) throws IOException;
11
+ public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException;
12
12
  }
@@ -22,16 +22,22 @@ public class RubyObjectDeserializer
22
22
  {
23
23
  private static final long serialVersionUID = 1L;
24
24
 
25
- private final static RubyObject[] NO_OBJECTS = new RubyObject[0];
25
+ // private final static RubyObject[] NO_OBJECTS = new RubyObject[0];
26
26
 
27
- protected final static Ruby __ruby__ = Ruby.getGlobalRuntime();
27
+ private Ruby _ruby;
28
28
 
29
29
  private RubyKeyConverter converter;
30
30
 
31
- public RubyObjectDeserializer() {
31
+ public RubyObjectDeserializer() {
32
32
  super(RubyObject.class);
33
33
  }
34
34
 
35
+ public RubyObjectDeserializer withRuby(Ruby ruby)
36
+ {
37
+ _ruby = ruby;
38
+ return this;
39
+ }
40
+
35
41
  public RubyObjectDeserializer setStringStrategy()
36
42
  {
37
43
  converter = new RubyStringConverter();
@@ -44,10 +50,6 @@ public class RubyObjectDeserializer
44
50
  return this;
45
51
  }
46
52
 
47
- /**
48
- * @since 2.2
49
- */
50
-
51
53
  /**
52
54
  /**********************************************************
53
55
  /* Deserializer API
@@ -66,38 +68,38 @@ public class RubyObjectDeserializer
66
68
  return mapArray(jp, ctxt);
67
69
 
68
70
  case FIELD_NAME:
69
- return converter.convert(jp);
71
+ return converter.convert(_ruby, jp);
70
72
 
71
73
  case VALUE_EMBEDDED_OBJECT:
72
- return RubyUtils.rubyObject(__ruby__, jp.getEmbeddedObject());
74
+ return RubyUtils.rubyObject(_ruby, jp.getEmbeddedObject());
73
75
 
74
76
  case VALUE_STRING:
75
- // return RubyUtils.rubyString(__ruby__, jp.getText().getBytes("UTF-8"));
76
- return RubyUtils.rubyString(__ruby__, jp.getText());
77
+ // return RubyUtils.rubyString(_ruby, jp.getText().getBytes("UTF-8"));
78
+ return RubyUtils.rubyString(_ruby, jp.getText());
77
79
 
78
80
  case VALUE_NUMBER_INT:
79
81
  /* [JACKSON-100]: caller may want to get all integral values
80
82
  * returned as BigInteger, for consistency
81
83
  */
82
84
  if (ctxt.isEnabled(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS)) {
83
- return RubyUtils.rubyBignum(__ruby__, jp.getBigIntegerValue());
85
+ return RubyUtils.rubyBignum(_ruby, jp.getBigIntegerValue());
84
86
  }
85
- return RubyUtils.rubyFixnum(__ruby__, jp.getLongValue());
87
+ return RubyUtils.rubyFixnum(_ruby, jp.getLongValue());
86
88
 
87
89
  case VALUE_NUMBER_FLOAT:
88
90
  if (ctxt.isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS)) {
89
- return RubyUtils.rubyBigDecimal(__ruby__, jp.getDecimalValue());
91
+ return RubyUtils.rubyBigDecimal(_ruby, jp.getDecimalValue());
90
92
  }
91
- return RubyUtils.rubyFloat(__ruby__, jp.getDoubleValue());
93
+ return RubyUtils.rubyFloat(_ruby, jp.getDoubleValue());
92
94
 
93
95
  case VALUE_TRUE:
94
- return __ruby__.newBoolean(Boolean.TRUE);
96
+ return _ruby.newBoolean(Boolean.TRUE);
95
97
 
96
98
  case VALUE_FALSE:
97
- return __ruby__.newBoolean(Boolean.FALSE);
99
+ return _ruby.newBoolean(Boolean.FALSE);
98
100
 
99
101
  case VALUE_NULL: // should not get this but...
100
- return null;
102
+ return (RubyObject)_ruby.getNil();
101
103
 
102
104
  case END_ARRAY: // invalid
103
105
  case END_OBJECT: // invalid
@@ -123,7 +125,7 @@ public class RubyObjectDeserializer
123
125
  // }
124
126
  // Minor optimization to handle small lists (default size for ArrayList is 10)
125
127
  if (jp.nextToken() == JsonToken.END_ARRAY) {
126
- return RubyArray.newArray(__ruby__);
128
+ return RubyArray.newArray(_ruby);
127
129
  }
128
130
  ObjectBuffer buffer = ctxt.leaseObjectBuffer();
129
131
  Object[] values = buffer.resetAndStart();
@@ -139,7 +141,7 @@ public class RubyObjectDeserializer
139
141
  values[ptr++] = value;
140
142
  } while (jp.nextToken() != JsonToken.END_ARRAY);
141
143
  // let's create almost full array, with 1/8 slack
142
- RubyArray result = RubyArray.newArray(__ruby__, (totalSize + (totalSize >> 3) + 1));
144
+ RubyArray result = RubyArray.newArray(_ruby, (totalSize + (totalSize >> 3) + 1));
143
145
  buffer.completeAndClearBuffer(values, ptr, result);
144
146
  return result;
145
147
  }
@@ -157,29 +159,29 @@ public class RubyObjectDeserializer
157
159
  // 1.6: minor optimization; let's handle 1 and 2 entry cases separately
158
160
  if (t != JsonToken.FIELD_NAME) { // and empty one too
159
161
  // empty map might work; but caller may want to modify... so better just give small modifiable
160
- return RubyHash.newHash(__ruby__);
162
+ return RubyHash.newHash(_ruby);
161
163
  }
162
164
 
163
- RubyObject field1 = converter.convert(jp);
165
+ RubyObject field1 = converter.convert(_ruby, jp);
164
166
  jp.nextToken();
165
167
  RubyObject value1 = deserialize(jp, ctxt);
166
168
  if (jp.nextToken() != JsonToken.FIELD_NAME) { // single entry; but we want modifiable
167
- return RuntimeHelpers.constructHash(__ruby__, field1, value1);
169
+ return RuntimeHelpers.constructHash(_ruby, field1, value1);
168
170
  }
169
171
 
170
- RubyObject field2 = converter.convert(jp);
172
+ RubyObject field2 = converter.convert(_ruby, jp);
171
173
  jp.nextToken();
172
174
  RubyObject value2 = deserialize(jp, ctxt);
173
175
  if (jp.nextToken() != JsonToken.FIELD_NAME) {
174
- return RuntimeHelpers.constructHash(__ruby__, field1, value1, field2, value2);
176
+ return RuntimeHelpers.constructHash(_ruby, field1, value1, field2, value2);
175
177
  }
176
178
 
177
179
  // And then the general case; default map size is 16
178
- RubyHash result = RuntimeHelpers.constructHash(__ruby__, field1, value1, field2, value2);
180
+ RubyHash result = RuntimeHelpers.constructHash(_ruby, field1, value1, field2, value2);
179
181
  do {
180
- RubyObject fieldName = converter.convert(jp);
182
+ RubyObject fieldName = converter.convert(_ruby, jp);
181
183
  jp.nextToken();
182
- result.fastASetCheckString(__ruby__, fieldName, deserialize(jp, ctxt));
184
+ result.fastASetCheckString(_ruby, fieldName, deserialize(jp, ctxt));
183
185
  } while (jp.nextToken() != JsonToken.END_OBJECT);
184
186
  return result;
185
187
  }
@@ -8,7 +8,7 @@ import org.jruby.RubyObject;
8
8
 
9
9
  public class RubyStringConverter implements RubyKeyConverter
10
10
  {
11
- public RubyObject convert(JsonParser jp) throws IOException {
12
- return RubyUtils.rubyString(Ruby.getGlobalRuntime(), jp.getText().getBytes());
11
+ public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
12
+ return RubyUtils.rubyString(ruby, jp.getText().getBytes());
13
13
  }
14
14
  }
@@ -8,7 +8,7 @@ import org.jruby.RubyObject;
8
8
 
9
9
  public class RubySymbolConverter implements RubyKeyConverter
10
10
  {
11
- public RubyObject convert(JsonParser jp) throws IOException {
12
- return RubyUtils.rubySymbol(Ruby.getGlobalRuntime(), jp.getText());
11
+ public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
12
+ return RubyUtils.rubySymbol(ruby, jp.getText());
13
13
  }
14
14
  }
@@ -91,6 +91,13 @@ class JrJacksonTest < Test::Unit::TestCase
91
91
  assert_equal expected, actual
92
92
  end
93
93
 
94
+ def test_can_parse_nulls
95
+ expected = {"foo" => nil}
96
+ json = '{"foo":null}'
97
+ actual = JrJackson::Json.parse(json)
98
+ assert_equal expected, actual
99
+ end
100
+
94
101
  def test_can_parse_big_decimals
95
102
  expected = BigDecimal.new '0.12345678901234567890123456789'
96
103
  json = '{"foo":0.12345678901234567890123456789}'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jrjackson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guy Boertje
@@ -59,7 +59,7 @@ files:
59
59
  - dependency-reduced-pom.xml
60
60
  - jrjackson.gemspec
61
61
  - lib/jrjackson.rb
62
- - lib/jrjackson/jars/jrjackson-1.2.4.jar
62
+ - lib/jrjackson/jars/jrjackson-1.2.6.jar
63
63
  - lib/jrjackson/jrjackson.rb
64
64
  - lib/jrjackson/version.rb
65
65
  - lib/require_relative_patch.rb
Binary file