diff --git a/lib/multi_json/engines/json_gem.rb b/lib/multi_json/engines/json_gem.rb index 50dd8150..dd2b1d49 100644 --- a/lib/multi_json/engines/json_gem.rb +++ b/lib/multi_json/engines/json_gem.rb @@ -9,6 +9,7 @@ class JsonGem def self.decode(string, options = {}) #:nodoc: opts = {} opts[:symbolize_names] = options[:symbolize_keys] + string = string.read if string.respond_to?(:read) ::JSON.parse(string, opts) end diff --git a/lib/multi_json/engines/json_pure.rb b/lib/multi_json/engines/json_pure.rb index 7c207a5a..f89da017 100644 --- a/lib/multi_json/engines/json_pure.rb +++ b/lib/multi_json/engines/json_pure.rb @@ -9,6 +9,7 @@ class JsonPure def self.decode(string, options = {}) #:nodoc: opts = {} opts[:symbolize_names] = options[:symbolize_keys] + string = string.read if string.respond_to?(:read) ::JSON.parse(string, opts) end diff --git a/lib/multi_json/engines/ok_json.rb b/lib/multi_json/engines/ok_json.rb index 020e3e85..cac7f654 100644 --- a/lib/multi_json/engines/ok_json.rb +++ b/lib/multi_json/engines/ok_json.rb @@ -6,6 +6,7 @@ class OkJson ParseError = ::OkJson::Error def self.decode(string, options = {}) #:nodoc: + string = string.read if string.respond_to?(:read) result = ::OkJson.decode(string) options[:symbolize_keys] ? symbolize_keys(result) : result end diff --git a/spec/multi_json_spec.rb b/spec/multi_json_spec.rb index e052bcb4..2b5864fa 100644 --- a/spec/multi_json_spec.rb +++ b/spec/multi_json_spec.rb @@ -1,5 +1,6 @@ require 'spec_helper' - +require 'stringio' + class MockDecoder def self.decode(string, options = {}) { 'abc' => 'def' } @@ -75,6 +76,11 @@ def self.encode(string) encoded_json = MultiJson.encode(:a => 1, :b => {:c => 2}) MultiJson.decode(encoded_json).should == { "a" => 1, "b" => { "c" => 2 } } end + + it "properly decodes valid JSON in StringIOs" do + json = StringIO.new('{"abc":"def"}') + MultiJson.decode(json).should == { 'abc' => 'def' } + end it 'allows for symbolization of keys' do MultiJson.decode('{"abc":{"def":"hgi"}}', :symbolize_keys => true).should == { :abc => { :def => 'hgi' } }