Ben
Ben

Reputation: 62464

How to pass the proper object to mapper.readValue()

I'm trying to map a json api response to an object and IntelliJ is complaining. It's saying cannot resolve method readValue(java.lang.String, java.lang.Object[]);. I realize I'm not passing the correct parameter but I've tried responseClass.class and responseClass.getClass() with no luck.

Usage:

MyClass myClass = new MyClass();
myClass.setResponseClass(User.class);

Definition:

MyClass {
    private Object responseClass;

    public void setResponseClass(Object responseClass) {
        this.responseClass = responseClass;
    }

    public Object getResponseClass() {
        return responseClass;
    }

    public void getApiResponse() {
        //some code here

        ObjectMapper mapper = new com.MyApp.Utility.ObjectMapper();

        //some code here

        //I've tried responseClass.class and responseClass.getClass(), it didn't like either of them
        mapper.readValue(response, responseClass);

        //more code here
    }
}

Upvotes: 0

Views: 13505

Answers (1)

Perception
Perception

Reputation: 80633

This is a really odd way of mapping JSON responses to object, using Jackson. I assume you just want to be able to map arbitrary classes using a utility class? Here's an example of a much easier way to accomplish this. Note that this uses the ObjectMapper class that comes with your Jackson distro:

public class JSONUtil {
    private ObjectMapper mapper = new ObjectMapper();

    public JSONUtil() {
        super();
        // Set ObjectMapper configuration and properties here
    }

    public <T> T deserialize(final String response, final Class<T> responseClass) {
        if(response == null || responseClass == null) return null;

        return mapper.readValue(response, responseClass);
    }
}

Now, you could still map your responses from JSON using the class you posted, with some modifications:

public class MyClass<T> {
    private Class<T> responseClass;

    public MyClass(final Class<T> responseClass) {
        super();
        this.responseClass = responseClass;
    }

    public void getApiResponse(final String response) {

        final ObjectMapper mapper = new ObjectMapper();
        final T values = mapper.readValue(response, responseClass);

        //more code here
    }
}

And using it as such:

MyClass<User> myClass = new MyClass<User>(User.class);
myClass.getApiResponse(someJsonString);

Upvotes: 2

Related Questions