public final <T> T read(T existingObject) throws IOException {
        try {
            this.existingObject = existingObject;
            Class<?> clazz = existingObject.getClass();
            String cacheKey = currentConfig().getDecoderCacheKey(clazz);
            return (T) Codegen.getDecoder(cacheKey, clazz).decode(this);
        } catch (ArrayIndexOutOfBoundsException e) {
            throw reportError("read", "premature end");
        }
    }
try to bind to existing object, returned object might not the same instance

@param existingObject the object instance to reuse
@param <T>            object type
@return data binding result, might not be the same object
@throws IOException if I/O went wrong
src/main/java/com/jsoniter/JsonIterator.java