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.

minijoe

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:
Deja una Respuesta