miércoles, 30 de abril de 2014

JSON Java Tomcat7

Desarrollando webservices JAX-RS que reciben JSON como parámetros de entrada y que entregan a su vez JSON, me encontré con la necesidad de parsear los JSON de entrada.


En anteriores servidores de aplicación y versiones anteriores de Java, utilicé Jackson, GSON y otros parseadores externos


Pero J2EE 7 proporciona una API JSON de forma nativa y no es necesario tener un "proveedor" externo.


Pero el API solo proporciona interfaces, sin implementación. Y depende cada servidor de aplicaciones la correcta implementación, en mi caso utilizo Tomcat 7 y parseando JSON recibía el siguiente error:


java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
        at java.lang.Thread.run(Thread.java:724)
Caused by: javax.json.JsonException: Provider org.glassfish.json.JsonProviderImp
l not found        at javax.json.spi.JsonProvider.provider(JsonProvider.java:97)
        at javax.json.Json.createArrayBuilder(Json.java:257)
...


Dicho error se solucionó con la siguiente configuración de Maven:




    javax
    javaee-api
    7.0
    provided


    javax.json
    javax.json-api
    1.0


    org.glassfish
    javax.json
    1.0
    runtime

Aquí dejo una función de ejemplo, que  parsea un token de Facebook y extrae el campo id:


public int idTokenFacebook ( String token ) throws IOException {
 Integer id=-1;
 String  aux;
 try (InputStream is = url.openStream();
 JsonReader rdr = Json.createReader(is)) {
  JsonObject obj = rdr.readObject();
  if ( obj.containsKey("id")) {
   aux = obj.getString("id");
   id = Integer.valueOf(aux);
  } else {
   id =0;
  }
  System.out.print("id: "+id);
  return id;
 }
}


No hay comentarios: