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:
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;
Integer id=-1;
String aux;
URL url = new URL("https://graph.facebook.com/me?access_token="+token);
try (InputStream is = url.openStream();
JsonReader rdr = Json.createReader(is)) {
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);
aux = obj.getString("id");
id = Integer.valueOf(aux);
} else {
id =0;
}
System.out.print("id: "+id);
return id;
}
}
}
}