public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    JsonToken token = jp.getCurrentToken();
    if (token == JsonToken.START_OBJECT) {
      token = jp.nextToken();
    }

    R reader = readerSupplier.get();
    while (token != null && token != JsonToken.END_OBJECT) {
      if (token != JsonToken.FIELD_NAME) {
        APIParsingException.raise(
            "Parsing of json failed.  Expected to be at field name token but was " + token.name(),
            jp);
      }

      String name = jp.getCurrentName();
      jp.nextToken();

      Optional<FieldParser<R>> fieldParser = registry.getFieldParser(name);
      if (fieldParser.isPresent()) {
        fieldParser.get().parse(reader, jp, ctxt);
      } else {
        jp.skipChildren();
      }

      token = jp.nextToken();
    }

    return reader.validateAndBuild();
  }