Skip to content

Instantly share code, notes, and snippets.

@billybong
Last active November 11, 2020 21:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save billybong/0b2963c85912f4a2ee7b591dd85a93b6 to your computer and use it in GitHub Desktop.
Save billybong/0b2963c85912f4a2ee7b591dd85a93b6 to your computer and use it in GitHub Desktop.
JacksonBodyHandler for parsing JSON responses directly from Java 11+ http clients
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.http.HttpResponse;
import java.util.function.Function;
public class JacksonBodyHandlers {
private final ObjectMapper objectMapper;
public JacksonBodyHandlers(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
public HttpResponse.BodyHandler<JsonNode> jsonNodeHandler(){
return responseInfo -> subscriberFrom(objectMapper::readTree);
}
public <T> HttpResponse.BodyHandler<T> handlerFor(TypeReference<T> typeReference){
return responseInfo -> subscriberFrom((bytes) -> objectMapper.readValue(bytes, typeReference));
}
public <T> HttpResponse.BodyHandler<T> handlerFor(Class<T> clazz){
return responseInfo -> subscriberFrom((bytes) -> objectMapper.readValue(bytes, clazz));
}
private <T> HttpResponse.BodySubscriber<T> subscriberFrom(IOFunction<byte[], T> ioFunction) {
return HttpResponse.BodySubscribers.mapping(HttpResponse.BodySubscribers.ofByteArray(), rethrowRuntime(ioFunction));
}
@FunctionalInterface
interface IOFunction<V, T> {
T apply(V value) throws IOException;
}
private static <V,T> Function<V,T> rethrowRuntime(IOFunction<V, T> ioFunction){
return (V v) -> {
try{
return ioFunction.apply(v);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
};
}
}
@billybong
Copy link
Author

Simple utility class for leveraging Jackson to parse Http responses from the standard Java 11+ http client.
Oh god how I wish the JDK came with native JSON support...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment