jrjackson 0.2.7 → 0.2.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9cfaa7407bdd2661d42803ddeb31cd08cb5f64cd
4
- data.tar.gz: 12c5ff2193c1b189cecbea58972a2f7b6aefb622
3
+ metadata.gz: 40a6bbd8555b9dca8cf37b6e7e2f41692ae2bd2b
4
+ data.tar.gz: af10130421ae850aea53f6b8396de32530605655
5
5
  SHA512:
6
- metadata.gz: a6c5d5db9a8874e9f19297de099a048c8913a8ad6df1d0e7758bd0dcfd9ef57a07dae2bd8db4c22b5dc077ff8745667ce23854c63e745cddb65b05c5e2f940db
7
- data.tar.gz: 677855c6cd7ae971d70b3865092483b8a55cf136ae07fed3e166440dd8ee843d562db67e72efa4a09513198c0a9c95c6f468e57ad840fbd9d77d5009e7d365bc
6
+ metadata.gz: bab3ca8847f2dbe92becd2fee1c201a0abd72378c922b0814920cba71ff8390f1fb9237ff1efa32c40ffbf8678d7fa3f255b9e85f45932fd57523de6c5982d2a
7
+ data.tar.gz: ae557540edc4d20a2e993da24f81d3ea35a092a2dd76b28815bede1ce9cac5a477aa9106277067749bc0a3a3487cc6a264b10d1fb10e09697a913868a6f33305
data/README.md CHANGED
@@ -18,8 +18,10 @@ There is now a MultiJson adapter added for JrJackson
18
18
 
19
19
  #### NEWS
20
20
 
21
+ 11th May 2014 - Added to_time method call for Ruby object serialization
22
+
21
23
  26th October 2013 - Added support to serialize arbitary (non JSON datatypes)
22
- ruby objects. Normally the toJava internal metod is called, but additionally
24
+ ruby objects. Normally the toJava internal method is called, but additionally
23
25
  to_h, to_hash, to_a and finally to_json are tried. Be aware that the to_json
24
26
  method might invoke a new selialization session and impact performance.
25
27
 
data/changelog.md CHANGED
@@ -1,8 +1,22 @@
1
+ v0.2.8
2
+ fixes for issues-28,29,31
3
+ correction for Time#to_s
4
+ new options to control date serialization
5
+ optimizations suggested by @headius
6
+ jar compiled for jruby 1.7.17
7
+ jruby 1.7.17
8
+ jackson 2.4.4
9
+
10
+ v0.2.7
11
+ fixes for issues-23,24
12
+ add to_time as option for serializing Time like objects
13
+ jar compiled for jruby 1.7.11
14
+
1
15
  v0.2.6
2
16
  fix issue-20
3
17
  allow jruby to convert Ruby StringIO into Java
4
18
  by not type checking passed arg
5
- this is because jruby 1.7.9 has changed the type of java object backing Ruby StingIO
19
+ this is because jruby 1.7.9 has changed the type of java object backing Ruby StringIO
6
20
  jar compiled for jruby 1.7.8 (jruby 1.7.9 in the maven repo has an error in the pom.xml)
7
21
  jruby 1.7.8, jruby 1.7.9 (tested)
8
22
  jackson 2.3.0
@@ -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.9</version>
7
+ <version>1.2.11</version>
8
8
  <url>http://maven.apache.org</url>
9
9
  <build>
10
10
  <plugins>
@@ -22,14 +22,14 @@
22
22
  </plugin>
23
23
  <plugin>
24
24
  <artifactId>maven-surefire-plugin</artifactId>
25
- <version>2.16</version>
25
+ <version>2.17</version>
26
26
  <configuration>
27
27
  <skipTests>true</skipTests>
28
28
  </configuration>
29
29
  </plugin>
30
30
  <plugin>
31
31
  <artifactId>maven-shade-plugin</artifactId>
32
- <version>2.1</version>
32
+ <version>2.3</version>
33
33
  <executions>
34
34
  <execution>
35
35
  <phase>package</phase>
@@ -66,7 +66,7 @@
66
66
  <dependency>
67
67
  <groupId>org.jruby</groupId>
68
68
  <artifactId>jruby</artifactId>
69
- <version>1.7.11</version>
69
+ <version>1.7.17</version>
70
70
  <scope>provided</scope>
71
71
  <exclusions>
72
72
  <exclusion>
@@ -1,7 +1,7 @@
1
1
  module JrJackson
2
2
  module BuildInfo
3
3
  def self.version
4
- '0.2.7'
4
+ '0.2.8'
5
5
  end
6
6
 
7
7
  def self.files
@@ -3,8 +3,8 @@ unless RUBY_PLATFORM =~ /java/
3
3
  exit 255
4
4
  end
5
5
 
6
- require_relative "jars/jrjackson-1.2.9.jar"
7
- # require_relative "linked/jrjackson-1.2.9.jar"
6
+ require_relative "jars/jrjackson-1.2.11.jar"
7
+ # require_relative "linked/jrjackson-1.2.11.jar"
8
8
 
9
9
  require 'com/jrjackson/jr_jackson'
10
10
 
@@ -31,10 +31,10 @@ module JrJackson
31
31
  end
32
32
  end
33
33
 
34
- def dump(object)
34
+ def dump(object, options = {})
35
35
  case object
36
- when Array, Hash, String, Java::JavaUtil::LinkedHashMap
37
- JrJackson::Raw.generate(object)
36
+ when Hash, Array, String, Java::JavaUtil::Map, Java::JavaUtil::List
37
+ JrJackson::Raw.generate(object, options)
38
38
  when true, false
39
39
  object.to_s
40
40
  when nil
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.9</version>
8
+ <version>1.2.11</version>
9
9
  <name>jrjackson</name>
10
10
  <url>http://maven.apache.org</url>
11
11
 
@@ -23,28 +23,28 @@
23
23
  <dependency>
24
24
  <groupId>org.jruby</groupId>
25
25
  <artifactId>jruby</artifactId>
26
- <version>1.7.11</version>
26
+ <version>1.7.17</version>
27
27
  <scope>provided</scope>
28
28
  </dependency>
29
29
  <dependency>
30
30
  <groupId>com.fasterxml.jackson.core</groupId>
31
31
  <artifactId>jackson-core</artifactId>
32
- <version>2.3.0</version>
32
+ <version>2.4.4</version>
33
33
  </dependency>
34
34
  <dependency>
35
35
  <groupId>com.fasterxml.jackson.core</groupId>
36
36
  <artifactId>jackson-annotations</artifactId>
37
- <version>2.3.0</version>
37
+ <version>2.4.4</version>
38
38
  </dependency>
39
39
  <dependency>
40
40
  <groupId>com.fasterxml.jackson.core</groupId>
41
41
  <artifactId>jackson-databind</artifactId>
42
- <version>2.3.0</version>
42
+ <version>2.4.4</version>
43
43
  </dependency>
44
44
  <dependency>
45
45
  <groupId>com.fasterxml.jackson.module</groupId>
46
46
  <artifactId>jackson-module-afterburner</artifactId>
47
- <version>2.3.0</version>
47
+ <version>2.4.4</version>
48
48
  </dependency>
49
49
  </dependencies>
50
50
  <build>
@@ -65,7 +65,7 @@
65
65
  <plugin>
66
66
  <groupId>org.apache.maven.plugins</groupId>
67
67
  <artifactId>maven-surefire-plugin</artifactId>
68
- <version>2.16</version>
68
+ <version>2.17</version>
69
69
  <configuration>
70
70
  <skipTests>true</skipTests>
71
71
  </configuration>
@@ -73,7 +73,7 @@
73
73
  <plugin>
74
74
  <groupId>org.apache.maven.plugins</groupId>
75
75
  <artifactId>maven-shade-plugin</artifactId>
76
- <version>2.1</version>
76
+ <version>2.3</version>
77
77
  <executions>
78
78
  <execution>
79
79
  <phase>package</phase>
@@ -1,23 +1,23 @@
1
1
  #!/bin/sh
2
2
 
3
- ruby benchmarking/individual/json-mri-sourced.rb
4
- ruby benchmarking/individual/oj-mri-sourced.rb
3
+ chruby-exec ruby-2.2.0 -- ruby benchmarking/individual/json-mri-sourced.rb
4
+ chruby-exec ruby-2.2.0 -- ruby benchmarking/individual/oj-mri-sourced.rb
5
5
 
6
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-jr-sourced.rb
7
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-jr-sourced.rb
6
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-jr-sourced.rb
7
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-jr-sourced.rb
8
8
 
9
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/string-jr-sourced.rb
10
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/str-bd-jr-sourced.rb
9
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/string-jr-sourced.rb
10
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/str-bd-jr-sourced.rb
11
11
 
12
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/symbol-jr-sourced.rb
13
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/sym-bd-jr-sourced.rb
12
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/symbol-jr-sourced.rb
13
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/sym-bd-jr-sourced.rb
14
14
 
15
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-jr-sourced.rb
16
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-bd-jr-sourced.rb
15
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-jr-sourced.rb
16
+ chruby-exec jruby-1.7.17 -- ruby -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
+ chruby-exec ruby-2.2.0 -- ruby benchmarking/individual/json-gen-mri-sourced.rb
19
+ chruby-exec ruby-2.2.0 -- ruby benchmarking/individual/oj-gen-mri-sourced.rb
20
20
 
21
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-gen-jr-sourced.rb
22
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-gen-jr-sourced.rb
23
- chruby-exec jruby -- jruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-gen-jr-sourced.rb
21
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/json-gen-jr-sourced.rb
22
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/gson-gen-jr-sourced.rb
23
+ chruby-exec jruby-1.7.17 -- ruby -J-Xmn512m -J-Xms2048m -J-Xmx2048m benchmarking/individual/raw-gen-jr-sourced.rb
@@ -6,20 +6,23 @@ import org.jruby.RubyObject;
6
6
  import org.jruby.RubyString;
7
7
  import org.jruby.RubySymbol;
8
8
  import org.jruby.RubyHash;
9
+ import org.jruby.RubyIO;
9
10
  import org.jruby.anno.JRubyMethod;
10
11
  import org.jruby.anno.JRubyModule;
11
- import org.jruby.java.addons.IOJavaAddons;
12
12
  import org.jruby.runtime.ThreadContext;
13
13
  import org.jruby.runtime.builtin.IRubyObject;
14
+ import org.jruby.ext.stringio.StringIO;
14
15
 
15
- import java.io.InputStream;
16
16
  import java.io.IOException;
17
- import java.util.*;
17
+
18
+ import java.text.SimpleDateFormat;
19
+ import java.util.TimeZone;
18
20
 
19
21
  import com.fasterxml.jackson.databind.ObjectMapper;
20
22
  import com.fasterxml.jackson.databind.DeserializationFeature;
21
23
  import com.fasterxml.jackson.core.JsonProcessingException;
22
24
 
25
+
23
26
  @JRubyModule(name = "JrJacksonRaw")
24
27
  public class JrJacksonRaw extends RubyObject {
25
28
 
@@ -41,7 +44,7 @@ public class JrJacksonRaw extends RubyObject {
41
44
  throws IOException {
42
45
  RubyHash options = null;
43
46
  ObjectMapper local = null;
44
- Ruby _ruby = context.getRuntime();
47
+ Ruby _ruby = context.runtime;
45
48
 
46
49
  if (opts != context.nil) {
47
50
  options = opts.convertToHash();
@@ -68,37 +71,44 @@ public class JrJacksonRaw extends RubyObject {
68
71
  @JRubyMethod(module = true, name = {"parse_raw", "load_raw"}, required = 1)
69
72
  public static IRubyObject parse_raw(ThreadContext context, IRubyObject self, IRubyObject arg)
70
73
  throws IOException {
71
- ObjectMapper mapper = RubyJacksonModule.mappedAs("raw", context.getRuntime());
74
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("raw", context.runtime);
72
75
  return _parse(context, arg, mapper);
73
76
  }
74
77
 
75
78
  @JRubyMethod(module = true, name = {"parse_sym", "load_sym"}, required = 1)
76
79
  public static IRubyObject parse_sym(ThreadContext context, IRubyObject self, IRubyObject arg)
77
80
  throws IOException {
78
- ObjectMapper mapper = RubyJacksonModule.mappedAs("sym", context.getRuntime());
81
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("sym", context.runtime);
79
82
  return _parse(context, arg, mapper);
80
83
  }
81
84
 
82
85
  @JRubyMethod(module = true, name = {"parse_str", "load_str"}, required = 1)
83
86
  public static IRubyObject parse_str(ThreadContext context, IRubyObject self, IRubyObject arg)
84
87
  throws IOException {
85
- ObjectMapper mapper = RubyJacksonModule.mappedAs("str", context.getRuntime());
88
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("str", context.runtime);
86
89
  return _parse(context, arg, mapper);
87
90
  }
88
91
 
89
92
  private static IRubyObject _parse(ThreadContext context, IRubyObject arg, ObjectMapper mapper)
90
93
  throws IOException {
91
- Ruby ruby = context.getRuntime();
94
+ Ruby ruby = context.runtime;
95
+ // same format as Ruby Time #to_s
96
+ SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
97
+ mapper.setDateFormat(simpleFormat);
92
98
  try {
93
99
  Object o;
94
100
  if (arg instanceof RubyString) {
95
101
  o = mapper.readValue(
96
- ((RubyString) arg).getBytes(), Object.class
102
+ ((RubyString) arg).getByteList().bytes(), Object.class
103
+ );
104
+ } else if (arg instanceof StringIO) {
105
+ RubyString content = (RubyString)((StringIO) arg).string(context);
106
+ o = mapper.readValue(
107
+ content.getByteList().bytes(), Object.class
97
108
  );
98
109
  } else {
99
110
  // must be an IO object then
100
- IRubyObject stream = IOJavaAddons.AnyIO.any_to_inputstream(context, arg);
101
- o = mapper.readValue((InputStream) stream.toJava(InputStream.class), Object.class);
111
+ o = mapper.readValue(((RubyIO)arg).getInStream(), Object.class);
102
112
  }
103
113
  return RubyUtils.rubyObject(ruby, o);
104
114
  } catch (JsonProcessingException e) {
@@ -109,13 +119,28 @@ public class JrJacksonRaw extends RubyObject {
109
119
  }
110
120
 
111
121
  // serialize
112
- @JRubyMethod(module = true, name = {"generate", "dump"}, required = 1)
113
- public static IRubyObject generate(ThreadContext context, IRubyObject self, IRubyObject arg)
122
+ @JRubyMethod(module = true, name = {"generate", "dump"}, required = 1, optional = 1)
123
+ public static IRubyObject generate(ThreadContext context, IRubyObject self, IRubyObject[] args)
114
124
  throws IOException, JsonProcessingException {
115
- Ruby _ruby = context.getRuntime();
116
- Object obj = arg.toJava(Object.class);
125
+ Ruby _ruby = context.runtime;
126
+ Object obj = args[0].toJava(Object.class);
127
+ RubyHash options = (args.length <= 1) ? RubyHash.newHash(_ruby) : args[1].convertToHash();
128
+ String format = (String) options.get(RubyUtils.rubySymbol(_ruby, "date_format"));
129
+
130
+ ObjectMapper mapper = RubyJacksonModule.mappedAs("raw", _ruby);
131
+ // same format as Ruby Time #to_s
132
+ SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
133
+
134
+ if (format != null) {
135
+ simpleFormat = new SimpleDateFormat(format);
136
+ String timezone = (String) options.get(RubyUtils.rubySymbol(_ruby, "timezone"));
137
+ if (timezone != null) {
138
+ simpleFormat.setTimeZone(TimeZone.getTimeZone(timezone));
139
+ }
140
+ }
141
+ mapper.setDateFormat(simpleFormat);
142
+
117
143
  try {
118
- ObjectMapper mapper = RubyJacksonModule.mappedAs("raw", _ruby);
119
144
  String s = mapper.writeValueAsString(obj);
120
145
  return RubyUtils.rubyString(_ruby, s);
121
146
  } catch (JsonProcessingException e) {
@@ -38,9 +38,8 @@ public class RubyAnySerializer extends StdSerializer<RubyObject> {
38
38
  return val;
39
39
  }
40
40
 
41
- private void serializeUnknownRubyObject(RubyObject rubyObject, JsonGenerator jgen, SerializerProvider provider)
41
+ private void serializeUnknownRubyObject(ThreadContext ctx, RubyObject rubyObject, JsonGenerator jgen, SerializerProvider provider)
42
42
  throws IOException, JsonGenerationException {
43
- ThreadContext ctx = rubyObject.getRuntime().getCurrentContext();
44
43
  RubyClass meta = rubyObject.getMetaClass();
45
44
 
46
45
  DynamicMethod method = meta.searchMethod("to_time");
@@ -87,16 +86,20 @@ public class RubyAnySerializer extends StdSerializer<RubyObject> {
87
86
  @Override
88
87
  public void serialize(RubyObject value, JsonGenerator jgen, SerializerProvider provider)
89
88
  throws IOException, JsonGenerationException {
89
+ ThreadContext ctx = value.getRuntime().getCurrentContext();
90
90
  if (value instanceof RubySymbol || value instanceof RubyString) {
91
91
  jgen.writeString(value.toString());
92
92
  } else if (value instanceof RubyHash) {
93
93
  provider.findTypedValueSerializer(Map.class, true, null).serialize(value, jgen, provider);
94
94
  } else if (value instanceof RubyArray) {
95
95
  provider.findTypedValueSerializer(List.class, true, null).serialize(value, jgen, provider);
96
+ } else if (value instanceof RubyStruct) {
97
+ RubyObject obj = (RubyObject)value.callMethod(ctx, "to_a");
98
+ provider.findTypedValueSerializer(List.class, true, null).serialize(obj, jgen, provider);
96
99
  } else {
97
100
  Object val = value.toJava(rubyJavaClassLookup(value.getClass()));
98
101
  if (val instanceof RubyObject) {
99
- serializeUnknownRubyObject((RubyObject) val, jgen, provider);
102
+ serializeUnknownRubyObject(ctx, (RubyObject) val, jgen, provider);
100
103
  } else {
101
104
  provider.defaultSerializeValue(val, jgen);
102
105
  }
@@ -19,7 +19,6 @@ public class RubyJacksonModule extends SimpleModule {
19
19
  static {
20
20
  static_mapper.registerModule(new AfterburnerModule());
21
21
  static_mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
22
- static_mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"));
23
22
  }
24
23
 
25
24
  private RubyJacksonModule() {
@@ -45,14 +44,9 @@ public class RubyJacksonModule extends SimpleModule {
45
44
  );
46
45
  }
47
46
  mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
48
- mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"));
49
47
  return mapper;
50
48
  }
51
49
 
52
- // public static SimpleModule asRaw()
53
- // {
54
- // return static_mapper;
55
- // }
56
50
  public static SimpleModule asSym(Ruby ruby) {
57
51
  return new RubyJacksonModule().addSerializer(
58
52
  RubyObject.class, RubyAnySerializer.instance
@@ -1,7 +1,6 @@
1
1
  package com.jrjackson;
2
2
 
3
3
  import java.io.IOException;
4
- import java.util.*;
5
4
 
6
5
  import com.fasterxml.jackson.core.*;
7
6
 
@@ -23,7 +22,8 @@ public class RubyObjectDeserializer
23
22
 
24
23
  private Ruby _ruby;
25
24
 
26
- private RubyKeyConverter converter;
25
+ private RubyKeyConverter key_converter;
26
+ final private RubyStringConverter str_converter = new RubyStringConverter();
27
27
 
28
28
  public RubyObjectDeserializer() {
29
29
  super(RubyObject.class);
@@ -35,12 +35,12 @@ public class RubyObjectDeserializer
35
35
  }
36
36
 
37
37
  public RubyObjectDeserializer setStringStrategy() {
38
- converter = new RubyStringConverter();
38
+ key_converter = str_converter;
39
39
  return this;
40
40
  }
41
41
 
42
42
  public RubyObjectDeserializer setSymbolStrategy() {
43
- converter = new RubySymbolConverter();
43
+ key_converter = new RubySymbolConverter();
44
44
  return this;
45
45
  }
46
46
 
@@ -65,20 +65,20 @@ public class RubyObjectDeserializer
65
65
  return mapArray(jp, ctxt);
66
66
 
67
67
  case FIELD_NAME:
68
- return converter.convert(_ruby, jp);
68
+ return key_converter.convert(_ruby, jp);
69
69
 
70
70
  case VALUE_EMBEDDED_OBJECT:
71
71
  return RubyUtils.rubyObject(_ruby, jp.getEmbeddedObject());
72
72
 
73
73
  case VALUE_STRING:
74
- // return RubyUtils.rubyString(_ruby, jp.getText().getBytes("UTF-8"));
75
- return RubyUtils.rubyString(_ruby, jp.getText());
74
+ return str_converter.convert(_ruby, jp);
76
75
 
77
76
  case VALUE_NUMBER_INT:
78
77
  /* [JACKSON-100]: caller may want to get all integral values
79
78
  * returned as BigInteger, for consistency
80
79
  */
81
- if (ctxt.isEnabled(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS)) {
80
+ JsonParser.NumberType numberType = jp.getNumberType();
81
+ if (ctxt.isEnabled(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS) || numberType == JsonParser.NumberType.BIG_INTEGER) {
82
82
  return RubyUtils.rubyBignum(_ruby, jp.getBigIntegerValue());
83
83
  }
84
84
  return RubyUtils.rubyFixnum(_ruby, jp.getLongValue());
@@ -165,14 +165,14 @@ public class RubyObjectDeserializer
165
165
  return RubyHash.newHash(_ruby);
166
166
  }
167
167
 
168
- RubyObject field1 = converter.convert(_ruby, jp);
168
+ RubyObject field1 = key_converter.convert(_ruby, jp);
169
169
  jp.nextToken();
170
170
  RubyObject value1 = deserialize(jp, ctxt);
171
171
  if (jp.nextToken() != JsonToken.FIELD_NAME) { // single entry; but we want modifiable
172
172
  return RuntimeHelpers.constructHash(_ruby, field1, value1);
173
173
  }
174
174
 
175
- RubyObject field2 = converter.convert(_ruby, jp);
175
+ RubyObject field2 = key_converter.convert(_ruby, jp);
176
176
  jp.nextToken();
177
177
  RubyObject value2 = deserialize(jp, ctxt);
178
178
  if (jp.nextToken() != JsonToken.FIELD_NAME) {
@@ -182,7 +182,7 @@ public class RubyObjectDeserializer
182
182
  // And then the general case; default map size is 16
183
183
  RubyHash result = RuntimeHelpers.constructHash(_ruby, field1, value1, field2, value2);
184
184
  do {
185
- RubyObject fieldName = converter.convert(_ruby, jp);
185
+ RubyObject fieldName = key_converter.convert(_ruby, jp);
186
186
  jp.nextToken();
187
187
  result.fastASetCheckString(_ruby, fieldName, deserialize(jp, ctxt));
188
188
  } while (jp.nextToken() != JsonToken.END_OBJECT);
@@ -3,6 +3,7 @@ package com.jrjackson;
3
3
  import com.fasterxml.jackson.core.*;
4
4
 
5
5
  import java.io.IOException;
6
+ import java.nio.CharBuffer;
6
7
  import org.jruby.Ruby;
7
8
  import org.jruby.RubyObject;
8
9
 
@@ -10,6 +11,9 @@ public class RubyStringConverter implements RubyKeyConverter {
10
11
 
11
12
  @Override
12
13
  public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
13
- return RubyUtils.rubyString(ruby, jp.getText().getBytes());
14
+ // return RubyUtils.rubyString(ruby, jp.getText());
15
+ return RubyUtils.rubyString(ruby,
16
+ CharBuffer.wrap(jp.getTextCharacters(), 0, jp.getTextLength())
17
+ );
14
18
  }
15
19
  }
@@ -4,6 +4,7 @@ import java.util.*;
4
4
 
5
5
  import java.math.BigDecimal;
6
6
  import java.math.BigInteger;
7
+ import java.nio.CharBuffer;
7
8
 
8
9
  import org.jruby.*;
9
10
  import org.jruby.javasupport.JavaUtil;
@@ -24,10 +25,14 @@ public class RubyUtils {
24
25
  return RubyString.newString(ruby, node);
25
26
  }
26
27
 
28
+ public static RubyString rubyString(Ruby ruby, CharSequence node) {
29
+ return RubyString.newUnicodeString(ruby, node);
30
+ }
31
+
27
32
  public static RubySymbol rubySymbol(Ruby ruby, String node) {
28
33
  return RubySymbol.newSymbol(ruby, node);
29
34
  }
30
-
35
+
31
36
  public static RubyArray rubyArray(Ruby ruby, Object[] arg) {
32
37
  return (RubyArray) JavaUtil.convertJavaToRuby(ruby, arg);
33
38
  }
@@ -9,6 +9,7 @@ require 'thread'
9
9
  require 'bigdecimal'
10
10
  require 'jrjackson'
11
11
  require 'stringio'
12
+ require 'time'
12
13
 
13
14
  class JrJacksonTest < Test::Unit::TestCase
14
15
 
@@ -92,17 +93,66 @@ class JrJacksonTest < Test::Unit::TestCase
92
93
  json_string = JrJackson::Json.dump(source)
93
94
  expected = {
94
95
  :sym => "a_symbol",
95
- :dt => dt.strftime("%F %T %Z"),
96
+ :dt => dt.strftime("%F %T %z"),
96
97
  :co1 => {:one => "uno", :two => "two", :six => 6.0 },
97
98
  :co2 => {:one => "uno", :two => "two", :six => 6.0 },
98
99
  :co3 => {:one => 1.0, :two => 2.0, :six => 6.0 },
99
100
  :co4 => [1, 2, 6],
100
- :co5 => dt.strftime("%F %T %Z")
101
+ :co5 => dt.strftime("%F %T %z")
101
102
  }
102
103
  actual = JrJackson::Json.load(json_string, :symbolize_keys => true)
103
104
  assert_equal expected, actual
104
105
  end
105
106
 
107
+ def test_raw_serialize_base_classes
108
+ # String
109
+ assert_equal JrJackson::Json.dump("foo"), "\"foo\""
110
+
111
+ # Hash and implementations of the Java Hash interface
112
+ assert_equal JrJackson::Json.dump({"foo" => 1}), "{\"foo\":1}"
113
+ assert_equal JrJackson::Json.dump(Java::JavaUtil::HashMap.new({"foo" => 1})), "{\"foo\":1}"
114
+ assert_equal JrJackson::Json.dump(Java::JavaUtil::LinkedHashMap.new({"foo" => 1})), "{\"foo\":1}"
115
+
116
+ # Array and implementations of the Java List interface
117
+ assert_equal JrJackson::Json.dump(["foo", 1]), "[\"foo\",1]"
118
+ assert_equal JrJackson::Json.dump(Java::JavaUtil::ArrayList.new(["foo", 1])), "[\"foo\",1]"
119
+ assert_equal JrJackson::Json.dump(Java::JavaUtil::LinkedList.new(["foo", 1])), "[\"foo\",1]"
120
+ assert_equal JrJackson::Json.dump(Java::JavaUtil::Vector.new(["foo", 1])), "[\"foo\",1]"
121
+
122
+ # true/false
123
+ assert_equal JrJackson::Json.dump(true), "true"
124
+ assert_equal JrJackson::Json.dump(false), "false"
125
+
126
+ # nil
127
+ assert_equal JrJackson::Json.dump(nil), "null"
128
+ end
129
+
130
+ def test_serialize_date
131
+ # default date format
132
+ time_string = "2014-06-10 18:18:40 EDT"
133
+ source_time = Time.parse(time_string)
134
+ serialized_output = JrJackson::Json.dump({"time" => source_time})
135
+ other_time = Time.parse(serialized_output.split('"')[-2])
136
+ assert_equal other_time.to_f, source_time.to_f
137
+ end
138
+
139
+ def test_serialize_date_date_format
140
+
141
+ time = Time.new(2014,6,10,18,18,40, "-04:00")
142
+ # using date_format option
143
+ assert_equal "{\"time\":\"2014-06-10\"}", JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd")
144
+ assert_match /\{"time"\:"\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}[+-]\d{4}"\}/, JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
145
+ end
146
+
147
+ def test_serialize_date_date_format_timezone
148
+
149
+ time = Time.new(2014,6,10,18,18,40, "-04:00")
150
+ # using date_format and timezone options
151
+ assert_equal "{\"time\":\"2014-06-10T22:18:40.000+0000\"}", JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd'T'HH:mm:ss.SSSZ", :timezone => "UTC")
152
+ # iso8601 date_format and timezone
153
+ assert_equal "{\"time\":\"2014-06-10T22:18:40.000Z\"}", JrJackson::Json.dump({"time" => time}, :date_format => "yyyy-MM-dd'T'HH:mm:ss.SSSX", :timezone => "UTC")
154
+ end
155
+
106
156
  def test_can_parse_nulls
107
157
  expected = {"foo" => nil}
108
158
  json = '{"foo":null}'
@@ -111,8 +161,17 @@ class JrJacksonTest < Test::Unit::TestCase
111
161
  end
112
162
 
113
163
  def test_stringio
114
- expected = {"foo" => 5}
115
- json = ::StringIO.new('{"foo":5}')
164
+ expected = {"foo" => 5, "utf8" => "żółć"}
165
+ json = ::StringIO.new('{"foo":5, "utf8":"żółć"}')
166
+ actual = JrJackson::Json.load(json)
167
+ assert_equal expected, actual
168
+ end
169
+
170
+ def test_ruby_io
171
+ expected = {"foo" => 5, "bar" => 6, "utf8" => "żółć"}
172
+ json, w = IO.pipe
173
+ w.write('{"foo":5, "bar":6, "utf8":"żółć"}')
174
+ w.close
116
175
  actual = JrJackson::Json.load(json)
117
176
  assert_equal expected, actual
118
177
  end
@@ -123,6 +182,14 @@ class JrJacksonTest < Test::Unit::TestCase
123
182
  end
124
183
  end
125
184
 
185
+ def test_can_parse_bignum
186
+ expected = 12345678901234567890123456789
187
+ json = '{"foo":12345678901234567890123456789}'
188
+
189
+ actual = JrJackson::Json.parse(json)['foo']
190
+ assert_equal expected, actual
191
+ end
192
+
126
193
  def test_can_parse_big_decimals
127
194
  expected = BigDecimal.new '0.12345678901234567890123456789'
128
195
  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.7
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guy Boertje
@@ -41,7 +41,7 @@ files:
41
41
  - jrjackson.gemspec
42
42
  - lib/jrjackson.rb
43
43
  - lib/jrjackson/build_info.rb
44
- - lib/jrjackson/jars/jrjackson-1.2.9.jar
44
+ - lib/jrjackson/jars/jrjackson-1.2.11.jar
45
45
  - lib/jrjackson/jrjackson.rb
46
46
  - lib/require_relative_patch.rb
47
47
  - pom.xml
@@ -79,8 +79,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  version: '0'
80
80
  requirements: []
81
81
  rubyforge_project:
82
- rubygems_version: 2.2.0
82
+ rubygems_version: 2.2.2
83
83
  signing_key:
84
84
  specification_version: 4
85
85
  summary: A JRuby wrapper for the java jackson json processor jar
86
86
  test_files: []
87
+ has_rdoc:
Binary file