Recientemente he necesitado utilizar JavaScript y JSON en un proyecto J2ME y he tenido la suerte de encontrar un par de librerías que me han facilitado mucho la labor.
Se trata de MiniJoe, un interprete JavaScript, y org.json.me, una librería JSON en J2ME.
Con MiniJoe puedes ejecutar JavaScript en el móvil. Aunque tiene algunas limitaciones y no es ni de lejos tan potente como Rhino, por ejemplo, hace su trabajo con un API tan restrictivo como CLDC 1.1.
El problema es que la documentación es escasa y solo estudiando el código consigues hacerte una idea de como se utiliza.
A continuación, incluyo algunos fragmentos de código Java que te pueden ser útiles si te ves en la circunstancia de tener que utilizar esta librería:
// Mi propio objeto JSON en Java visible desde JS
public class JSON extends JsObject
{
// ID de la función JS parse implementada en Java
static final int ID_PARSE = 101;
// ID de la función JS stringify implementada en Java
static final int ID_STRINGIFY = 102;
public JSON()
{
super(new JsObject(OBJECT_PROTOTYPE));
// Añado la función parse que recibe un parámetro
addNative("parse", ID_PARSE, 1);
// Añado la función stringify que recibe un parámetro
addNative("stringify", ID_STRINGIFY, 1);
}
// Implemementación de los métodos JSON nativos en Java
public void evalNative(int id, JsArray stack, int sp, int parCount)
{
switch(id)
{
// Los parámetros se obtienen de la pila
// sp + 2 = primer parámetro, sp + 3 = segundo, ...
case ID_PARSE:
stack.setObject(sp, parse(stack.getString(sp + 2)));
break;
case ID_STRINGIFY:
stack.setObject(sp, stringfy((JsObject)stack.getObject(sp + 2)));
break;
default:
super.evalNative(id, stack, sp, parCount);
}
}
// De String a JsObject
private JsObject parse(String str)
{
...
}
// De JsObject a String
public static String stringfy(JsObject obj)
{
...
}
}
// Esta clase proveerá funciones y variables globales
// En concreto una función trace y la variable global JSON
public class MyEnvironment extends Eval
{
// ID de la función JS trace implementada en Java
static final int ID_TRACE = 101;
public MyEnvironment()
{
super();
// Añado la función trace que recibe un parámetro
addVar("trace", new JsFunction(ID_TRACE, 1));
// Añado la variable global JSON
// Los objetos deben ser subclases de JsObject
addVar("JSON", new JSON());
}
// Implemementación de funciones nativas en Java
public void evalNative(int id, JsArray stack, int sp, int parCount)
{
switch(id)
{
case ID_TRACE:
trace(stack.getString(sp + 2));
break;
default:
super.evalNative(id, stack, sp, parCount);
}
}
// Implementación de trace en Java
private void trace(String text)
{
System.out.println("Traza: " + text);
}
}
// Punto de entrada
public static void main(String args[])
{
// Obtener el script
String script = ...
// Ejecutarlo en un entorno que contiene la función trace y el objeto JSON
MyEnviroment env = new MyEnviroment();
MyEnvironment.eval(script, env);
}
La otra librería, org.json.me es mas sencilla y dispone de mas documentación. Aún así, el siguiente fragmento de código te puede ser útil para empezar:
// PARSE
// Cadena JSON
String str = ...
// Convertir a JSON (parse)
JSONObject json = new JSONObject(str);
// Obtener campos de JSON
System.out.println(json.getString("campo1"));
System.out.println(json.getBoolean("campo2"));
// STRINGIFY
// Cambiar el vlor de algunos campos
json.put("campo1", "Prueba");
// Convertir a cadena
System.out.println(json.toString());
Tags: JavaScript JSON J2ME Java Programación
Entradas (RSS)