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