user441174
user441174

Reputation: 73

How to upcast an Object to a java.util.Map?

I have an object in my code of the type Object: Object o

The class of the instance is Object: o.getClass() gives Object.

Now, it should be a Map! How can I upcast this to a Map?

I tried: Map<String, Object> map = (HashMap<String,Object>)o

But this returns: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.HashMap

The instance 'o' comes from a XMLRPC request. This request does not qualify variables correctly supposedly

Please have a look at this!?

EDIT:

Now I have the following issue: o.getClass().getName() gives java.util.ArrayList,

o.get(0) gives [Ljava.lang.Object;@739e8329,

and o.get(0).getClass().getName() gives java.lang.String.

I cannot findout what to do..

EDIT2:

Finally I found out what happened. The software that created this object flattened a datastructure into a String (valueOf()). So, when I printed the variable it returned a [Ljava.util.Object, which was in fact a String containing this information.

Thanks guys!

Upvotes: 7

Views: 42889

Answers (4)

Darshil Shah
Darshil Shah

Reputation: 495

ObjectMapper oMapper = new ObjectMapper();
    Map<String, String> map = oMapper.convertValue(YOUROBJECT, Map.class);
    List<InputValues> inputValuesList = new ArrayList<InputValues>();
   for(String key : map.keySet()){
        inputValuesList.add(new InputValues(key,map.get(key).toString()) );
    }


    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>

InputValues class has 2 Strings.Also Jackson Dependency has to be added.

Upvotes: 2

amorfis
amorfis

Reputation: 15770

You cannot cast o to Map, because it does not implement Map interface. Exception shows that o is array of Objects.

Upvotes: 1

Grzegorz Oledzki
Grzegorz Oledzki

Reputation: 24251

[Ljava.lang.Object indicates the type of the object o is an array of Objects - that is Object[]. You cannot cast it to Map.

You might find it useful if took a look at: java: what is this: [Ljava.lang.Object;?

You stated that .getClass() indicated Object, but was it Object or [LObject? Compare to:

    Object[] array= new Object[]{};
    Object simple = new Object();

    System.out.println(array.getClass());
    System.out.println(simple.getClass());      

which prints:

class [Ljava.lang.Object;
class java.lang.Object

Upvotes: 10

Andreas Dolk
Andreas Dolk

Reputation: 114767

The error clearly indicates, that o does not implement the Map interface. So it is impossible to cast this object to Map.

The result is an array of Objects. Maybe, the array actually holds maps. Try if this works:

 Object[] objects = (Object[]) o;
 if (objects != null && objects.length > 0) {
    Object object = objects[0];
    if (object instanceof Map) {
      Map map = (Map) object;
      System.out.println("Heureka!");
    }
 }

Upvotes: 8

Related Questions