jrjackson 0.0.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +8 -1
- data/README.md +59 -0
- data/Rakefile +1 -151
- data/benchmarking/.jrubyrc +434 -0
- data/benchmarking/benchmark.rb +92 -20
- data/jrjackson.gemspec +17 -16
- data/lib/jrjackson.rb +2 -10
- data/lib/jrjackson/jars/jrjackson-1.0.jar +0 -0
- data/lib/jrjackson/jrjackson.rb +44 -34
- data/lib/jrjackson/version.rb +1 -1
- data/lib/require_relative_patch.rb +6 -0
- data/pom.xml +86 -0
- data/src/main/java/com/jrjackson/JrJacksonRaw.java +76 -0
- data/src/main/java/com/jrjackson/JrJacksonService.java +29 -0
- data/src/main/java/com/jrjackson/JrJacksonStr.java +80 -0
- data/src/main/java/com/jrjackson/JrJacksonSym.java +80 -0
- data/src/main/java/com/jrjackson/ParseError.java +15 -0
- data/src/main/java/com/jrjackson/RubyObjectDeserializer.java +257 -0
- data/src/main/java/com/jrjackson/RubyObjectSymDeserializer.java +80 -0
- metadata +33 -22
- data/README +0 -44
- data/lib/jrjackson/jackson-core-asl-1.9.5.jar +0 -0
- data/lib/jrjackson/jackson-mapper-asl-1.9.5.jar +0 -0
- data/lib/jrjackson/jackson-smile-1.9.5.jar +0 -0
- data/lib/jrjackson/rubify.rb +0 -35
- data/lib/jrjackson/rubify_with_symbol_keys.rb +0 -34
- data/lib/jrjackson_r.rb +0 -11
- data/lib/jrjackson_r_sym.rb +0 -11
data/benchmarking/benchmark.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
4
|
require 'benchmark'
|
5
|
+
require 'thread'
|
3
6
|
require 'digest'
|
4
7
|
require 'json'
|
5
|
-
require '
|
8
|
+
require 'gson'
|
9
|
+
|
10
|
+
require File.expand_path('lib/jrjackson')
|
6
11
|
|
7
12
|
HASH = {:one => nil, :two => nil, :three => nil, :four => {:a => nil, :b => nil, :c =>nil},
|
8
13
|
:five => {:d => nil, :e => nil},
|
9
14
|
:six => {:f => nil, :g => nil, :h =>nil, :i => nil, :j => nil, :k => nil, :l => nil},
|
10
|
-
:seven => nil, :eight =>
|
15
|
+
:seven => nil, :eight => [],
|
11
16
|
:nine => {:m => {:A => nil, :B => nil}}}
|
12
17
|
|
13
18
|
def random_string
|
@@ -22,6 +27,14 @@ def random_float
|
|
22
27
|
random_number + rand
|
23
28
|
end
|
24
29
|
|
30
|
+
def fill_array
|
31
|
+
value = []
|
32
|
+
5.times do
|
33
|
+
value.push send(METHODS[rand(3)])
|
34
|
+
end
|
35
|
+
value
|
36
|
+
end
|
37
|
+
|
25
38
|
def randomize_entries hsh
|
26
39
|
new_hsh = {}
|
27
40
|
hsh.each_pair do |key, value|
|
@@ -30,6 +43,8 @@ def randomize_entries hsh
|
|
30
43
|
new_hsh[key] = send METHODS[rand(3)]
|
31
44
|
when Hash
|
32
45
|
new_hsh[key] = randomize_entries value
|
46
|
+
when Array
|
47
|
+
new_hsh[key] = fill_array
|
33
48
|
end
|
34
49
|
end
|
35
50
|
new_hsh
|
@@ -39,44 +54,101 @@ METHODS = [:random_string, :random_number, :random_float]
|
|
39
54
|
|
40
55
|
org_array = []
|
41
56
|
one = []
|
42
|
-
|
43
|
-
0.upto(
|
57
|
+
|
58
|
+
0.upto(5000) do |i|
|
44
59
|
hsh = HASH.dup
|
45
60
|
org_array << randomize_entries(hsh)
|
46
61
|
end
|
47
62
|
|
48
63
|
generated_array = []
|
49
64
|
generated_smile = []
|
50
|
-
|
65
|
+
q = Queue.new
|
51
66
|
|
52
67
|
org_array.each do |hsh|
|
53
|
-
generated_array << JrJackson::
|
54
|
-
generated_smile << JrJackson::Smile.generate(hsh)
|
68
|
+
generated_array << JrJackson::Raw.generate(hsh)
|
55
69
|
end
|
56
70
|
|
57
|
-
Benchmark.bmbm("jackson
|
71
|
+
Benchmark.bmbm("jackson parse symbol keys: ".size) do |x|
|
58
72
|
|
59
|
-
x.report("
|
60
|
-
|
73
|
+
x.report("json java parse:") do
|
74
|
+
th1 = Thread.new(generated_array) do |arry|
|
75
|
+
50.times {arry.each {|string| ::JSON.parse("[#{string}]").first }}
|
76
|
+
q << true
|
77
|
+
end
|
78
|
+
th2 = Thread.new(generated_array) do |arry|
|
79
|
+
50.times {arry.each {|string| ::JSON.parse("[#{string}]").first }}
|
80
|
+
q << true
|
81
|
+
end
|
82
|
+
q.pop
|
83
|
+
q.pop
|
84
|
+
# 50.times {generated_array.each {|string| ::JSON.parse("[#{string}]").first }}
|
61
85
|
end
|
62
86
|
|
63
|
-
x.report("
|
64
|
-
|
87
|
+
x.report("gson parse:") do
|
88
|
+
th1 = Thread.new(generated_array) do |arry|
|
89
|
+
50.times {arry.each {|string| ::Gson::Decoder.new({}).decode(string) }}
|
90
|
+
q << true
|
91
|
+
end
|
92
|
+
th2 = Thread.new(generated_array) do |arry|
|
93
|
+
50.times {arry.each {|string| ::Gson::Decoder.new({}).decode(string) }}
|
94
|
+
q << true
|
95
|
+
end
|
96
|
+
q.pop
|
97
|
+
q.pop
|
98
|
+
# 50.times {generated_array.each {|string| ::Gson::Decoder.new({}).decode(string) }}
|
65
99
|
end
|
66
100
|
|
67
|
-
x.report("
|
68
|
-
|
101
|
+
x.report("jackson parse raw:") do
|
102
|
+
th1 = Thread.new(generated_array) do |arry|
|
103
|
+
50.times {arry.each {|string| JrJackson::Raw.parse(string) }}
|
104
|
+
q << true
|
105
|
+
end
|
106
|
+
th2 = Thread.new(generated_array) do |arry|
|
107
|
+
50.times {arry.each {|string| JrJackson::Raw.parse(string) }}
|
108
|
+
q << true
|
109
|
+
end
|
110
|
+
q.pop
|
111
|
+
q.pop
|
112
|
+
# 50.times {generated_array.each {|string| JrJackson::Raw.parse(string) }}
|
69
113
|
end
|
70
114
|
|
71
|
-
x.report("jackson parse:") do
|
72
|
-
|
115
|
+
x.report("jackson parse symbol keys:") do
|
116
|
+
th1 = Thread.new(generated_array) do |arry|
|
117
|
+
50.times {arry.each {|string| JrJackson::Sym.parse(string) }}
|
118
|
+
q << true
|
119
|
+
end
|
120
|
+
th2 = Thread.new(generated_array) do |arry|
|
121
|
+
50.times {arry.each {|string| JrJackson::Sym.parse(string) }}
|
122
|
+
q << true
|
123
|
+
end
|
124
|
+
q.pop
|
125
|
+
q.pop
|
126
|
+
# 50.times {generated_array.each {|string| JrJackson::Sym.parse(string) }}
|
73
127
|
end
|
74
128
|
|
75
|
-
x.report("
|
76
|
-
|
129
|
+
x.report("jackson parse string keys:") do
|
130
|
+
th1 = Thread.new(generated_array) do |arry|
|
131
|
+
50.times {arry.each {|string| JrJackson::Str.parse(string) }}
|
132
|
+
q << true
|
133
|
+
end
|
134
|
+
th2 = Thread.new(generated_array) do |arry|
|
135
|
+
50.times {arry.each {|string| JrJackson::Str.parse(string) }}
|
136
|
+
q << true
|
137
|
+
end
|
138
|
+
q.pop
|
139
|
+
q.pop
|
140
|
+
# 50.times {generated_array.each {|string| JrJackson::Str.parse(string) }}
|
77
141
|
end
|
78
142
|
|
79
|
-
x.report("
|
80
|
-
|
143
|
+
x.report("json java generate:") do
|
144
|
+
50.times {org_array.each {|hsh| hsh.to_json }}
|
145
|
+
end
|
146
|
+
|
147
|
+
x.report("gson generate:") do
|
148
|
+
50.times {org_array.each {|hsh| ::Gson::Encoder.new({}).encode(hsh) }}
|
149
|
+
end
|
150
|
+
|
151
|
+
x.report("jackson generate:") do
|
152
|
+
50.times {org_array.each {|hsh| JrJackson::Raw.generate(hsh) }}
|
81
153
|
end
|
82
154
|
end
|
data/jrjackson.gemspec
CHANGED
@@ -2,39 +2,40 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'jrjackson'
|
5
|
-
s.version = '0.0
|
6
|
-
s.date = '
|
5
|
+
s.version = '0.1.0'
|
6
|
+
s.date = '2013-03-31'
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ['Guy Boertje']
|
9
9
|
s.email = ['guyboertje@gmail.com']
|
10
10
|
s.homepage = "http://github.com/guyboertje/jrjackson"
|
11
11
|
s.summary = %q{A JRuby wrapper for the java jackson json processor jar}
|
12
|
-
s.description = %q{}
|
12
|
+
s.description = %q{A mostly native JRuby wrapper for the java jackson json processor jar}
|
13
|
+
|
14
|
+
s.add_development_dependency 'bundler', '~> 1.0'
|
13
15
|
|
14
16
|
# = MANIFEST =
|
15
17
|
s.files = %w[
|
16
18
|
Gemfile
|
17
|
-
README
|
19
|
+
README.md
|
18
20
|
Rakefile
|
21
|
+
benchmarking/.jrubyrc
|
19
22
|
benchmarking/benchmark.rb
|
20
23
|
jrjackson.gemspec
|
21
24
|
lib/jrjackson.rb
|
22
|
-
lib/jrjackson/
|
23
|
-
lib/jrjackson/jackson-mapper-asl-1.9.5.jar
|
24
|
-
lib/jrjackson/jackson-smile-1.9.5.jar
|
25
|
+
lib/jrjackson/jars/jrjackson-1.0.jar
|
25
26
|
lib/jrjackson/jrjackson.rb
|
26
|
-
lib/jrjackson/rubify.rb
|
27
|
-
lib/jrjackson/rubify_with_symbol_keys.rb
|
28
27
|
lib/jrjackson/version.rb
|
29
|
-
lib/
|
30
|
-
|
28
|
+
lib/require_relative_patch.rb
|
29
|
+
pom.xml
|
31
30
|
profiling/profiled.rb
|
31
|
+
src/main/java/com/jrjackson/JrJacksonRaw.java
|
32
|
+
src/main/java/com/jrjackson/JrJacksonService.java
|
33
|
+
src/main/java/com/jrjackson/JrJacksonStr.java
|
34
|
+
src/main/java/com/jrjackson/JrJacksonSym.java
|
35
|
+
src/main/java/com/jrjackson/ParseError.java
|
36
|
+
src/main/java/com/jrjackson/RubyObjectDeserializer.java
|
37
|
+
src/main/java/com/jrjackson/RubyObjectSymDeserializer.java
|
32
38
|
]
|
33
39
|
# = MANIFEST =
|
34
40
|
|
35
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
36
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
37
|
-
|
38
|
-
s.add_development_dependency 'awesome_print', '~> 0.4.0'
|
39
|
-
|
40
41
|
end
|
data/lib/jrjackson.rb
CHANGED
@@ -1,10 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
exit 255
|
4
|
-
end
|
5
|
-
|
6
|
-
require 'java'
|
7
|
-
|
8
|
-
$CLASSPATH << 'jrjackson'
|
9
|
-
|
10
|
-
require File.join("jrjackson","jrjackson")
|
1
|
+
require "require_relative_patch" unless Kernel.respond_to?(:require_relative)
|
2
|
+
require_relative "jrjackson/jrjackson"
|
Binary file
|
data/lib/jrjackson/jrjackson.rb
CHANGED
@@ -1,41 +1,51 @@
|
|
1
|
-
|
1
|
+
unless RUBY_PLATFORM =~ /java/
|
2
|
+
puts "This library is only compatible with a java-based ruby environment like JRuby."
|
3
|
+
exit 255
|
4
|
+
end
|
2
5
|
|
3
|
-
|
4
|
-
|
5
|
-
include_package "org.codehaus.jackson.map"
|
6
|
-
include_package "org.codehaus.jackson.smile"
|
6
|
+
require_relative "jars/jrjackson-1.0.jar"
|
7
|
+
require 'com/jrjackson/jr_jackson'
|
7
8
|
|
8
|
-
|
9
|
+
module JrJackson
|
10
|
+
module Json
|
11
|
+
class << self
|
12
|
+
TIME_REGEX = %r(\A\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d)
|
13
|
+
def load(json_string, options = {})
|
14
|
+
mod = if options[:raw]
|
15
|
+
JrJackson::Raw
|
16
|
+
elsif options[:symbolize_keys]
|
17
|
+
JrJackson::Sym
|
18
|
+
else
|
19
|
+
JrJackson::Str
|
20
|
+
end
|
21
|
+
if json_string.is_a?(String) && json_string =~ TIME_REGEX
|
22
|
+
mod.parse("\"#{json_string}\"")
|
23
|
+
else
|
24
|
+
mod.parse(json_string)
|
25
|
+
end
|
26
|
+
end
|
9
27
|
|
10
|
-
|
11
|
-
|
28
|
+
def dump(object)
|
29
|
+
case object
|
30
|
+
when Array, Hash
|
31
|
+
JrJackson::Raw.generate(object)
|
32
|
+
when String
|
33
|
+
"\"#{object}\""
|
34
|
+
when nil, true, false
|
35
|
+
object
|
36
|
+
else
|
37
|
+
if object.respond_to?(:to_json)
|
38
|
+
object.to_json
|
39
|
+
elsif object.respond_to?(:to_s)
|
40
|
+
object.to_s
|
41
|
+
else
|
42
|
+
object
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
12
46
|
|
13
|
-
|
14
|
-
|
15
|
-
Mapper.read_value json_string, Jclass
|
16
|
-
end
|
17
|
-
def self.generate(object)
|
18
|
-
Mapper.writeValueAsString(object)
|
19
|
-
end
|
20
|
-
def self.load(json_string)
|
21
|
-
Mapper.read_value json_string, Jclass
|
22
|
-
end
|
23
|
-
def self.dump(object)
|
24
|
-
Mapper.writeValueAsString(object)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
module Smile
|
28
|
-
def self.parse(smile_bytes)
|
29
|
-
SmileMapper.read_value smile_bytes,0,smile_bytes.size, Jclass
|
30
|
-
end
|
31
|
-
def self.generate(object)
|
32
|
-
SmileMapper.writeValueAsBytes(object)
|
33
|
-
end
|
34
|
-
def self.load(smile_bytes)
|
35
|
-
SmileMapper.read_value smile_bytes,0,smile_bytes.size, Jclass
|
36
|
-
end
|
37
|
-
def self.dump(object)
|
38
|
-
SmileMapper.writeValueAsBytes(object)
|
47
|
+
alias :parse :load
|
48
|
+
alias :generate :dump
|
39
49
|
end
|
40
50
|
end
|
41
51
|
end
|
data/lib/jrjackson/version.rb
CHANGED
data/pom.xml
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
2
|
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
3
|
+
<modelVersion>4.0.0</modelVersion>
|
4
|
+
|
5
|
+
<groupId>com.jrjackson.jruby</groupId>
|
6
|
+
<artifactId>jrjackson</artifactId>
|
7
|
+
<packaging>jar</packaging>
|
8
|
+
<version>1.0</version>
|
9
|
+
<name>jrjackson</name>
|
10
|
+
<url>http://maven.apache.org</url>
|
11
|
+
|
12
|
+
<properties>
|
13
|
+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
14
|
+
</properties>
|
15
|
+
|
16
|
+
<dependencies>
|
17
|
+
<dependency>
|
18
|
+
<groupId>junit</groupId>
|
19
|
+
<artifactId>junit</artifactId>
|
20
|
+
<version>4.11</version>
|
21
|
+
<scope>test</scope>
|
22
|
+
</dependency>
|
23
|
+
<dependency>
|
24
|
+
<groupId>org.jruby</groupId>
|
25
|
+
<artifactId>jruby</artifactId>
|
26
|
+
<version>1.7.3</version>
|
27
|
+
</dependency>
|
28
|
+
<dependency>
|
29
|
+
<groupId>com.fasterxml.jackson.core</groupId>
|
30
|
+
<artifactId>jackson-core</artifactId>
|
31
|
+
<version>2.1.4</version>
|
32
|
+
</dependency>
|
33
|
+
<dependency>
|
34
|
+
<groupId>com.fasterxml.jackson.core</groupId>
|
35
|
+
<artifactId>jackson-annotations</artifactId>
|
36
|
+
<version>2.1.4</version>
|
37
|
+
</dependency>
|
38
|
+
<dependency>
|
39
|
+
<groupId>com.fasterxml.jackson.core</groupId>
|
40
|
+
<artifactId>jackson-databind</artifactId>
|
41
|
+
<version>2.1.4</version>
|
42
|
+
</dependency>
|
43
|
+
</dependencies>
|
44
|
+
<build>
|
45
|
+
<plugins>
|
46
|
+
<plugin>
|
47
|
+
<groupId>org.apache.maven.plugins</groupId>
|
48
|
+
<artifactId>maven-compiler-plugin</artifactId>
|
49
|
+
<version>3.0</version>
|
50
|
+
<configuration>
|
51
|
+
<source>1.6</source>
|
52
|
+
<target>1.6</target>
|
53
|
+
</configuration>
|
54
|
+
</plugin>
|
55
|
+
<plugin>
|
56
|
+
<groupId>org.apache.maven.plugins</groupId>
|
57
|
+
<artifactId>maven-surefire-plugin</artifactId>
|
58
|
+
<version>2.12.2</version>
|
59
|
+
<configuration>
|
60
|
+
<parallel>methods</parallel>
|
61
|
+
<threadCount>10</threadCount>
|
62
|
+
</configuration>
|
63
|
+
</plugin>
|
64
|
+
<plugin>
|
65
|
+
<groupId>org.apache.maven.plugins</groupId>
|
66
|
+
<artifactId>maven-shade-plugin</artifactId>
|
67
|
+
<version>1.6</version>
|
68
|
+
<executions>
|
69
|
+
<execution>
|
70
|
+
<phase>package</phase>
|
71
|
+
<goals>
|
72
|
+
<goal>shade</goal>
|
73
|
+
</goals>
|
74
|
+
<configuration>
|
75
|
+
<artifactSet>
|
76
|
+
<excludes>
|
77
|
+
<exclude>org.jruby:jruby</exclude>
|
78
|
+
</excludes>
|
79
|
+
</artifactSet>
|
80
|
+
</configuration>
|
81
|
+
</execution>
|
82
|
+
</executions>
|
83
|
+
</plugin>
|
84
|
+
</plugins>
|
85
|
+
</build>
|
86
|
+
</project>
|
@@ -0,0 +1,76 @@
|
|
1
|
+
package com.jrjackson;
|
2
|
+
|
3
|
+
import org.jruby.Ruby;
|
4
|
+
import org.jruby.RubyClass;
|
5
|
+
import org.jruby.RubyObject;
|
6
|
+
import org.jruby.RubyString;
|
7
|
+
import org.jruby.RubyIO;
|
8
|
+
import org.jruby.anno.JRubyMethod;
|
9
|
+
import org.jruby.anno.JRubyModule;
|
10
|
+
import org.jruby.exceptions.RaiseException;
|
11
|
+
import org.jruby.ext.stringio.RubyStringIO;
|
12
|
+
import org.jruby.java.addons.IOJavaAddons;
|
13
|
+
import org.jruby.javasupport.JavaUtil;
|
14
|
+
import org.jruby.runtime.ThreadContext;
|
15
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
16
|
+
import org.jruby.util.RubyDateFormat;
|
17
|
+
|
18
|
+
import java.io.InputStream;
|
19
|
+
import java.io.IOException;
|
20
|
+
import java.text.DateFormat;
|
21
|
+
import java.util.*;
|
22
|
+
|
23
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
24
|
+
import com.fasterxml.jackson.core.JsonProcessingException;
|
25
|
+
|
26
|
+
@JRubyModule(name = "JrJacksonRaw")
|
27
|
+
public class JrJacksonRaw extends RubyObject {
|
28
|
+
protected static final ObjectMapper mapper = new ObjectMapper();
|
29
|
+
|
30
|
+
static {
|
31
|
+
mapper.setDateFormat(new RubyDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.US, true));
|
32
|
+
}
|
33
|
+
|
34
|
+
public JrJacksonRaw(Ruby ruby, RubyClass metaclass) {
|
35
|
+
super(ruby, metaclass);
|
36
|
+
}
|
37
|
+
|
38
|
+
@JRubyMethod(module = true, name = {"parse", "load"}, required = 1)
|
39
|
+
public static IRubyObject parse(ThreadContext context, IRubyObject self, IRubyObject arg) {
|
40
|
+
Ruby ruby = context.getRuntime();
|
41
|
+
try {
|
42
|
+
Object o;
|
43
|
+
if (arg instanceof RubyString) {
|
44
|
+
o = mapper.readValue(arg.toString(), Object.class);
|
45
|
+
} else if ((arg instanceof RubyIO) || (arg instanceof RubyStringIO)) {
|
46
|
+
IRubyObject stream = IOJavaAddons.AnyIO.any_to_inputstream(context, arg);
|
47
|
+
o = mapper.readValue((InputStream)stream.toJava(InputStream.class), Object.class);
|
48
|
+
} else {
|
49
|
+
throw ruby.newArgumentError("Unsupported source. This method accepts String or IO");
|
50
|
+
}
|
51
|
+
return (RubyObject)JavaUtil.convertJavaToRuby(ruby, o);
|
52
|
+
}
|
53
|
+
catch (JsonProcessingException e) {
|
54
|
+
throw ParseError.newParseError(ruby, e.getLocalizedMessage());
|
55
|
+
}
|
56
|
+
catch (IOException e) {
|
57
|
+
throw ruby.newIOError(e.getLocalizedMessage());
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
@JRubyMethod(module = true, name = {"generate", "dump"}, required = 1)
|
62
|
+
public static IRubyObject generate(ThreadContext context, IRubyObject self, IRubyObject arg) {
|
63
|
+
Ruby ruby = context.getRuntime();
|
64
|
+
Object obj = arg.toJava(Object.class);
|
65
|
+
try {
|
66
|
+
String s = mapper.writeValueAsString(obj);
|
67
|
+
return ruby.newString(s);
|
68
|
+
}
|
69
|
+
catch (JsonProcessingException e) {
|
70
|
+
throw ParseError.newParseError(ruby, e.getLocalizedMessage());
|
71
|
+
}
|
72
|
+
catch (IOException e) {
|
73
|
+
throw ruby.newIOError(e.getLocalizedMessage());
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|