@Override
    public T deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
        try {
            T obj = deserializeClass.newInstance();

            while (true) {
                JsonToken token = jp.nextValue();
                if (token.equals(JsonToken.END_OBJECT)) {
                    break;
                }
                if (token.equals(JsonToken.START_OBJECT)) {
                    continue;
                }

                String name = jp.getCurrentName();
                Integer val = jsonNameToField.get(name);
                if (val == null || val < 0) {
                    break;
                }
                JsonFieldDeserializer deserializer = idIndexedFieldArray.get(val);
                deserializer.deserialize(obj, jp, dc);
            }

            return obj;
        } catch (InstantiationException e) {
            throw new RuntimeException("Class default contructor thrown exception", e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("Class does not provide an accesible default contructor", e);
        }
    }