lib/httpx/transcoder/json.rb in httpx-0.20.5 vs lib/httpx/transcoder/json.rb in httpx-0.21.0
- old
+ new
@@ -1,9 +1,8 @@
# frozen_string_literal: true
require "forwardable"
-require "json"
module HTTPX::Transcoder
module JSON
JSON_REGEX = %r{\bapplication/(?:vnd\.api\+)?json\b}i.freeze
@@ -17,11 +16,11 @@
def_delegator :@raw, :to_s
def_delegator :@raw, :bytesize
def initialize(json)
- @raw = ::JSON.dump(json)
+ @raw = JSON.json_dump(json)
@charset = @raw.encoding.name.downcase
end
def content_type
"application/json; charset=#{@charset}"
@@ -35,10 +34,27 @@
def decode(response)
content_type = response.content_type.mime_type
raise HTTPX::Error, "invalid json mime type (#{content_type})" unless JSON_REGEX.match?(content_type)
- ::JSON.method(:parse)
+ method(:json_load)
end
+
+ # rubocop:disable Style/SingleLineMethods
+ if defined?(MultiJson)
+ def json_load(*args); MultiJson.load(*args); end
+ def json_dump(*args); MultiJson.dump(*args); end
+ elsif defined?(Oj)
+ def json_load(response, *args); Oj.load(response.to_s, *args); end
+ def json_dump(*args); Oj.dump(*args); end
+ elsif defined?(Yajl)
+ def json_load(response, *args); Yajl::Parser.new(*args).parse(response.to_s); end
+ def json_dump(*args); Yajl::Encoder.encode(*args); end
+ else
+ require "json"
+ def json_load(*args); ::JSON.parse(*args); end
+ def json_dump(*args); ::JSON.dump(*args); end
+ end
+ # rubocop:enable Style/SingleLineMethods
end
register "json", JSON
end