public T deserialize()

in sdk/core/azure-core-jackson/src/main/java/com/azure/android/core/serde/jackson/JacksonSerder.java [257:317]


    public <T> T deserialize(Map<String, String> headers, Type deserializedHeadersType) throws IOException {
        if (deserializedHeadersType == null) {
            return null;
        }

        final String headersJsonString = this.headerMapper.writeValueAsString(headers);
        T deserializedHeaders =
            this.headerMapper.readValue(headersJsonString, createJavaType(deserializedHeadersType));

        final Class<?> deserializedHeadersClass = TypeUtil.getRawClass(deserializedHeadersType);
        final Field[] declaredFields = deserializedHeadersClass.getDeclaredFields();
        for (final Field declaredField : declaredFields) {
            if (!declaredField.isAnnotationPresent(HeaderCollection.class)) {
                continue;
            }

            final Type declaredFieldType = declaredField.getGenericType();
            if (!TypeUtil.isTypeOrSubTypeOf(declaredField.getType(), Map.class)) {
                continue;
            }

            final Type[] mapTypeArguments = TypeUtil.getTypeArguments(declaredFieldType);
            if (mapTypeArguments.length == 2
                && mapTypeArguments[0] == String.class
                && mapTypeArguments[1] == String.class) {
                final HeaderCollection headerCollectionAnnotation = declaredField.getAnnotation(HeaderCollection.class);
                final String headerCollectionPrefix = headerCollectionAnnotation.value().toLowerCase(Locale.ROOT);
                final int headerCollectionPrefixLength = headerCollectionPrefix.length();
                if (headerCollectionPrefixLength > 0) {
                    final Map<String, String> headerCollection = new HashMap<>();
                    for (final Map.Entry<String, String> header : headers.entrySet()) {
                        final String headerName = header.getKey();
                        if (headerName.toLowerCase(Locale.ROOT).startsWith(headerCollectionPrefix)) {
                            headerCollection.put(headerName.substring(headerCollectionPrefixLength),
                                header.getValue());
                        }
                    }

                    final boolean declaredFieldAccessibleBackup = declaredField.isAccessible();
                    try {
                        if (!declaredFieldAccessibleBackup) {
                            AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                                declaredField.setAccessible(true);
                                return null;
                            });
                        }
                        declaredField.set(deserializedHeaders, headerCollection);
                    } catch (IllegalAccessException ignored) {
                    } finally {
                        if (!declaredFieldAccessibleBackup) {
                            AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                                declaredField.setAccessible(false);
                                return null;
                            });
                        }
                    }
                }
            }
        }
        return deserializedHeaders;
    }