I have an Abstract class with many concrete implementations:
public abstract Ticket {
   private Long id;
   private Currency fine;
   ...
}
public class SpeedingTicket extends Ticket {
   public Currency getFine(){
      // Expensive!
      ...
   }
}
public class ParkingTicket  extends Ticket {
   public Currency getFine(){
      // Eh, not so bad
      ...
   }
}
When the concrete classes are serialized into JSON, it is wrapped with the classes simple name (speedingTickets or parkingTickets):
"_embedded": {
   "speedingTickets" :
    [{
      "id":1,
      "fine": "$190",
       ...,
    },
    {
      "id":2,
      "fine": "$100",
       ...,
    }]
}
or
"_embedded": {
   "parkingTickets" :[{
      "id":100,
      "fine": "$15",
       ...,
    }]
}
Since I do not know, at runtime, which Ticket implementation I am receiving back, how can I parse the JSON out using the JSON Response API given the array is wrapped with the concrete implementations simple name?
I have a hack where I take the String value of the JSON and do String operations (substring, indexOf, etc) on it to return only what's in between the braces ("[...]"). I know there's a better way to do this...
After some research, I think I'll try the following tomorrow to see if it works:
JsonNode rootNode = mapper.readTree(jsonResponse);
String classImpl = Iterables.get(rootNode.get("_embedded").fields(), 0).textValue()
I can then say List<Ticket> tickets = response.readAsList(jsonResponse, "_embedded",classImpl) which should allow me to parse the JSON into a List