@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class PersonsReader implements MessageBodyReader<List<Person>> {
static final Logger LOGGER = Logger.getLogger(PersonsReader.class.getName());
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return List.class.isAssignableFrom(type);
}
@Override
public List<Person> readFrom(Class<List<Person>> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException {
List<Person> lista = new ArrayList<>(); //creo mi contenedor de objetos
Person p = null; //sera mi contenedor por elemento del arreglo
JsonParser parser = Json.createParser(entityStream); //creo mi procesador JSON desde el Stream
while (parser.hasNext()) { //... recorro el stream buscando sus elementos
JsonParser.Event parserNext = parser.next();
LOGGER.log(Level.INFO, "parser.next:{0}", parserNext);
switch (parserNext) {
case START_OBJECT: //si es el comienzo de un objeto
p = new Person(); //creo un elemento del arreglo, y guardare todo alli
break;
case KEY_NAME: //si es un nombre de atributo..
if (p == null) //...pero aun no se ha instanciado un objeto temporal
{
break; // ... termino
}
String key = parser.getString(); //.. sino, obtengo el nombre lo obtengo
parser.next(); //... paso al sigueinte elemento
switch (key) { //... y dependiendo del nombre del atributo
case "nombre":
p.setName(parser.getString()); //... pongo el valor en el bean
break;
case "id":
p.setPersonaId(parser.getInt());
break;
case "sexo":
p.setGender(parser.getString());
break;
}
break;
case END_OBJECT: // si termina un objeto
if (p != null) { //.. y se habia creado un objeto..
lista.add(p); // el elemento llenado, lo agrego a la lista
p = null; //.. e inicializo la variable temporal en NULL
}
break;
}
}
return lista;
}
}