In Java generics are more or less gone at runtime. This is called type erasure. So your HashMap<String, Object> will just be HashMap<?, ?> when your programme runs. So Jackson cannot determine the types Stringand Object. That is why you have to create a TypeReference which will preserve that information at runtime so Jackson can deserialise your JSON String into the correct classes.

If you don't specify a type Jackson will still be able to correctly deserialise simple objects like String or numbers but when a more complex object is encountered it will simply deserialise them into LinkedHashMap which will then most likely lead to a ClassCastException when you try to access the deserialised object.

Answer from geanakuch on Stack Overflow
🌐
Fasterxml
fasterxml.github.io › jackson-core › javadoc › 2.2.0 › com › fasterxml › jackson › core › type › TypeReference.html
TypeReference (Jackson-core 2.2.0 API)
com.fasterxml.jackson.core.type.TypeReference<T> All Implemented Interfaces: Comparable<TypeReference<T>> public abstract class TypeReference<T> extends Object implements Comparable<TypeReference<T>> This generic abstract class is used for obtaining full generics type information by sub-classing; ...
Top answer
1 of 2
26

In Java generics are more or less gone at runtime. This is called type erasure. So your HashMap<String, Object> will just be HashMap<?, ?> when your programme runs. So Jackson cannot determine the types Stringand Object. That is why you have to create a TypeReference which will preserve that information at runtime so Jackson can deserialise your JSON String into the correct classes.

If you don't specify a type Jackson will still be able to correctly deserialise simple objects like String or numbers but when a more complex object is encountered it will simply deserialise them into LinkedHashMap which will then most likely lead to a ClassCastException when you try to access the deserialised object.

2 of 2
9

This TypeReference<T> implements Comparable<TypeReference<T>> is part of jackon library. And this is part of com.fasterxml.jackson.core.type. From the API documentation:

This generic abstract class is used for obtaining full generics type information by sub-classing; it must be converted to ResolvedType implementation (implemented by JavaType from "databind" bundle) to be used. Class is based on ideas from http://gafter.blogspot.com/2006/12/super-type-tokens.html, Additional idea (from a suggestion made in comments of the article) is to require bogus implementation of Comparable (any such generic interface would do, as long as it forces a method with generic type to be implemented). to ensure that a Type argument is indeed given. Usage is by sub-classing: here is one way to instantiate reference to generic type List:

TypeReference ref = new TypeReference<List>() { }; which can be passed to methods that accept TypeReference, or resolved using TypeFactory to obtain ResolvedType.

This is basically used to de-serialize the Generic type of JSON objects, for example the JAVA Collection objects as below:

public List<Double> getDoubleList() {

  return getObjectFromJson(new TypeReference<List<Double>>() {
  });
}


public <T> T getObjectFromJson(String jsonString, final TypeReference<T> typeReference) {
  try {
    return new ObjectMapper().readValue(jsonString, typeReference);
  } catch (JsonProcessingException e) {
    // TODO
  }
}
Discussions

Writing a jackson type reference
You can add the jackson-module-kotlin dependency https://github.com/FasterXML/jackson-module-kotlin It adds some extension functions, including a new readValue that doesn't require a TypeReference because it's an inline function that makes the TypeReference for you, allowing you to write import com.fasterxml.jackson.module.kotlin.readValue ... val names: List = mapper.readValue(json) Also, Kotlin does have a special typeOf() function that does exactly what you describe, although doesn't look like this jackson module uses it More on reddit.com
🌐 r/Kotlin
2
1
October 24, 2024
java - Jackson and generic type reference - Stack Overflow
I want to use jackson json library for a generic method as follows: public MyRequest tester() { TypeReference More on stackoverflow.com
🌐 stackoverflow.com
java - Using TypeReference with Jackson - Stack Overflow
No, you can not use type variables like T this way with TypeReference: you must pass actual parameterization. This is because there is no runtime information whatsoever associated with T here: it is just a placeholder. More on stackoverflow.com
🌐 stackoverflow.com
json - Java/Jackson - how does TypeReference() actually work? - Stack Overflow
I'm parsing JSON strings sent from my WLAN speakers using Java/Jackson, whose format is unfortunately varying. While there's some static and not so important part of the response which is quite eas... More on stackoverflow.com
🌐 stackoverflow.com
🌐
Baeldung
baeldung.com › home › json › jackson › deserialize generic type with jackson
Deserialize Generic Type with Jackson | Baeldung
September 17, 2025 - As well known, Java erases generic ... type information during compile time. Jackson provides the abstract class TypeReference to obtain the type information from the derivated subclasses:...
🌐
Northcoder
northcoder.com › post › jackson-object-mapper-which-way-is
Jackson's ObjectMapper and TypeReference | northCoder
January 15, 2021 - Note the use of {} in the syntax for declaring the new TypeReference. TypeReference is an abstract class.
🌐
Javadoc.io
javadoc.io › doc › com.fasterxml.jackson.core › jackson-core › latest › com › fasterxml › jackson › core › type › TypeReference.html
TypeReference - jackson-core 2.22.3 javadoc
Latest version of com.fasterxml.jackson.core:jackson-core · https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-core · Current version 2.22.3 · https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-core/2.22.3 · package-list path (used for javadoc generation -link option) https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-core/2.22.3/package-list ·
🌐
Fasterxml
fasterxml.github.io › jackson-core › javadoc › 1.9 › org › codehaus › jackson › type › TypeReference.html
TypeReference (Jackson JSON Processor)
org.codehaus.jackson.type.TypeReference<T> All Implemented Interfaces: Comparable<TypeReference<T>> public abstract class TypeReference<T> extends Object implements Comparable<TypeReference<T>> This class is used to pass full generics type information, and avoid problems with type erasure (that ...
Find elsewhere
🌐
Reddit
reddit.com › r/kotlin › writing a jackson type reference
r/Kotlin on Reddit: Writing a jackson type reference
October 24, 2024 -

I'm using a jackson object mapper to deserialize json. If I need to get a List<String>, I need to pass a type reference because neither java nor Kotlin let me write List<String>.class. In java the type reference is

new TypeReference<List<String>>() {}

while in Kotlin is

object : TypeReference<List<String>>() {}

And this is the only simple case when the kotlin code is longer than the java code. And it is also as horrible as the java version

Am I doing something wrong?

Since what jackson really needs is a type, I wish we could have a special syntax for this case, kotlink could let us write generic-type-of(List<Integer>) and return a nice type...

Top answer
1 of 3
267

This is a well-known problem with Java type erasure: T is just a type variable, and you must indicate actual class, usually as Class argument. Without such information, best that can be done is to use bounds; and plain T is roughly same as 'T extends Object'. And Jackson will then bind JSON Objects as Maps.

In this case, tester method needs to have access to Class, and you can construct

JavaType type = mapper.getTypeFactory().
  constructCollectionType(List.class, Foo.class)

and then

List<Foo> list = mapper.readValue(new File("input.json"), type);
2 of 3
12

'JavaType' works !! I was trying to unmarshall (deserialize) a List in json String to ArrayList java Objects and was struggling to find a solution since days.
Below is the code that finally gave me solution. Code:

JsonMarshallerUnmarshaller<T> {
    T targetClass;

    public ArrayList<T> unmarshal(String jsonString) {
        ObjectMapper mapper = new ObjectMapper();

        AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
        mapper.getDeserializationConfig()
            .withAnnotationIntrospector(introspector);

        mapper.getSerializationConfig()
            .withAnnotationIntrospector(introspector);
        JavaType type = mapper.getTypeFactory().
            constructCollectionType(
                ArrayList.class, 
                targetclass.getClass());

        try {
            Class c1 = this.targetclass.getClass();
            Class c2 = this.targetclass1.getClass();
            ArrayList<T> temp = (ArrayList<T>) 
                mapper.readValue(jsonString,  type);
            return temp ;
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null ;
    }  
}
🌐
DEV Community
dev.to › emilossola › a-comprehensive-guide-for-java-typereference-249m
A Comprehensive Guide for Java TypeReference - DEV Community
July 10, 2023 - The Java TypeReference is a utility class provided by the Jackson library, which is used for capturing and retaining generic type information at runtime.
🌐
Adobe Developer
developer.adobe.com › experience-manager › reference-materials › 6-5 › javadoc › com › fasterxml › jackson › core › type › TypeReference.html
TypeReference (The Adobe AEM Quickstart and Web Application.)
com.fasterxml.jackson.core.typ... java.lang.Object implements java.lang.Comparable<TypeReference<T>> This generic abstract class is used for obtaining full generics type information by sub-classing; it must be converted to ResolvedType implementation (implemented by JavaType ...
🌐
Fasterxml
fasterxml.github.io › jackson-core › javadoc › 2.8 › com › fasterxml › jackson › core › type › TypeReference.html
TypeReference (Jackson-core 2.8.0 API)
com.fasterxml.jackson.core.type.TypeReference<T> All Implemented Interfaces: Comparable<TypeReference<T>> public abstract class TypeReference<T> extends Object implements Comparable<TypeReference<T>> This generic abstract class is used for obtaining full generics type information by sub-classing; ...
🌐
Javadoc.io
javadoc.io › doc › org.codehaus.jackson › jackson-core-asl › 1.9.13 › org › codehaus › jackson › type › TypeReference.html
TypeReference - jackson-core-asl 1.9.13 javadoc
Latest version of org.codehaus.jackson:jackson-core-asl · https://javadoc.io/doc/org.codehaus.jackson/jackson-core-asl · Current version 1.9.13 · https://javadoc.io/doc/org.codehaus.jackson/jackson-core-asl/1.9.13 · package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org.codehaus.jackson/jackson-core-asl/1.9.13/package-list ·
🌐
Java Tips
javatips.net › api › com.fasterxml.jackson.core.type.typereference
Java Examples for com.fasterxml.jackson.core.type.TypeReference
@Test public void testSserializeUser() throws Exception { User user = new User(1L, "Foo Bar", "foo", "foo", "hash"); String expected = MAPPER.writeValueAsString(MAPPER.readValue(fixture("fixtures/user-nopassword.json"), new TypeReference<LinkedHashMap<String, Object>>() { })); assertEquals(expected, MAPPER.writeValueAsString(user)); } ... @Test public void testUnmarshal() throws IOException { // Read in the JSON from the example resources InputStream is = UserOrdersJSONTest.class.getResourceAsStream("/trade/example-userorders.json"); // Use Jackson to parse it ObjectMapper mapper = new ObjectM
🌐
Medium
medium.com › @poojaauma › enhancing-deserialization-safety-in-java-with-typereference-ea110ece6994
Enhancing Deserialization Safety in Java with TypeReference | by Umadevi R | Medium
November 7, 2024 - In this article, we’ll explore what TypeReference does, why it’s essential for safe deserialization, and how it can help avoid common pitfalls in handling JSON data. When using Jackson’s ObjectMapper to deserialize JSON, specifying the type directly using .readValue(json, Class<T>) works well for simple types.
🌐
Fasterxml
fasterxml.github.io › jackson-core › javadoc › 2.12 › com › fasterxml › jackson › core › type › TypeReference.html
TypeReference (Jackson-core 2.12.0 API)
com.fasterxml.jackson.core.type.TypeReference<T> All Implemented Interfaces: Comparable<TypeReference<T>> public abstract class TypeReference<T> extends Object implements Comparable<TypeReference<T>> This generic abstract class is used for obtaining full generics type information by sub-classing; ...