@Override
  public Object decode(Response response, Type type) throws IOException, DecodeException {
    if (response.status() == 404 || response.status() == 204)
      if (JSONObject.class.isAssignableFrom((Class<?>) type)) return new JSONObject();
      else if (JSONArray.class.isAssignableFrom((Class<?>) type)) return new JSONArray();
      else if (String.class.equals(type)) return null;
      else
        throw new DecodeException(
            response.status(),
            format("%s is not a type supported by this decoder.", type),
            response.request());
    if (response.body() == null) return null;
    try (Reader reader = response.body().asReader(response.charset())) {
      Reader bodyReader = (reader.markSupported()) ? reader : new BufferedReader(reader);
      bodyReader.mark(1);
      if (bodyReader.read() == -1) {
        return null; // Empty body
      }
      bodyReader.reset();
      return decodeBody(response, type, bodyReader);
    } catch (JSONException jsonException) {
      if (jsonException.getCause() != null && jsonException.getCause() instanceof IOException) {
        throw (IOException) jsonException.getCause();
      }
      throw new DecodeException(
          response.status(), jsonException.getMessage(), response.request(), jsonException);
    }
  }
Decodes responses using JSON-java.

<p>Basic example with {@link feign.Feign.Builder}:

<pre>
  interface GitHub {

    {@literal @}RequestLine("GET /repos/{owner}/{repo}/contributors")
    JSONArray contributors({@literal @}Param("owner") String owner, {@literal @}Param("repo") String repo);

  }

  GitHub github = Feign.builder()
                     .decoder(new JsonDecoder())
                     .target(GitHub.class, "https://api.github.com");

  JSONArray contributors = github.contributors("openfeign", "feign");

  System.out.println(contributors.getJSONObject(0).getString("login"));
</pre>
json/src/main/java/feign/json/JsonDecoder.java