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

@param typeLiteral    the type object
@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