lunes, 26 de enero de 2009

clases javascript para json

En el trabajo, decidí utilizar JSON para el trasiego de datos, que la verdad, es bastante grande y por lo tanto lo mejor es organizarse, buscar alternativas a ir creando parámetros de forma dinámica para enviar por POST y sobre todo, ligeras (XML acaba metiendo muchos caracteres).
Por si alguno aún no sabe lo que es JSON, nada más que decir que es un formato de intercambio de datos ligero y fácilmente entendible para el ser humano (a menos que el chorizo sea muy grande claro :P). Un ejemplo de dato es:
["nombre":"Manolo","apellido":"Kabezabolo"]

Y un ejemplo de array y luego los mezclo:
["hola",4,"foo","bar","etc]
["nombre":"Manolo","array1":["hola",4,"foo","bar","etc],"objetoJSON":{"obj":"valor"}]

Como habéis visto, se puede encadenar entre objetos también, bueno, símplemente se manda como una cadena por un único parámetro y luego accedes como el objeto JSON que es, podéis utilizar la librería oficial o alguna librería que haga alguien, yo para javascript me he un par de clases simples para la crearme objetos y arrays:

function JSONObject(){
this.key = new Array();
this.value = new Array();
this.addObject = function(key, value){
if(key==null)
key = "";
if(value==null) value = "";

this.key.push(key);
this.value.push(value);
};
// función que pasa a string
this.toString = function(){
var string = "";
for(var i=0; i<this.key.length; i++){
if(i!=0) string+=",";
string+='"'+this.key[i]+'":';
// si es un string, se pone entre comillas
if((typeof this.value[i]) == "string")
string+='"'+this.value[i]+'"';
else
string+=this.value[i];
}
return "{"+string+"}";
};
// función para obtener un objeto de una posición concreta
this.getObject = function(index){
var ret = null;
if(0<=index && index<this.key.length)
ret = "{"+this.key[index]+":"+this.value[index]+"}";
return ret;
};
// Función para devolver una clave de una posición
this.getKey = function(index){
var ret=null;
if(0<=index && index<this.key.length)
ret=this.key[index];
return ret;
};
// Función para cambiar una clave que está en una posición concreta
this.setKey = function(index,key){
if(key==null) key = "";
if(0<=index && index<this.key.length)
this.key[index]=key;
};
// Función que cambia una clave a partir de otra (cambia la primera que ve)
this.setKeyByName = function(old_key,new_key){
if(new_key==null) new_key = "";
for(var i=0; i<this.key.length; i++)
if(this.key[i]==old_key){
this.key[i]=new_key;
// salgo porque solo modifica
// el primero que encuentra
break;
}
};
// obtiene el valor de una posición
this.getValue = function(index){
var ret=null;
if(0<=index && index<this.value.length)
ret=this.value[index];
return ret;
};
// Modifica el valor de una posición
this.setValue = function(index,value){
if(value==null) value = "";
if(0<=index && index<this.value.length)
this.value[index]=value;
};
// Modifica el valor de un objeto con un valor concreto (el primero que se encuentre)
this.setValueByName = function(old_value,new_value){
if(new_value==null) new_value = "";
for(var i=0; i<this.value.length; i++)
if(this.value[i]==old_value){
this.value[i]=new_value;
// salgo porque solo modifica
// el primero que encuentra
break;
}
}
// para ver el tipo de objeto que es
this.getType="JSONObject";
}

function JSONArray(){
this.elements = new Array();
// añade un item al array
this.addItem = function(value){
// si es un string lo entrecomilla
if((typeof value) == "string")
value = '"'+value+'"';
this.elements.push(value);
};
// pasa a string el array
this.toString = function(){
return "["+this.elements.join(",")+"]";
};
// devuelve un item
this.getItem = function(index){
var ret = null;
if(0<=index && index<this.elements.length)
ret = this.elements[index];
return ret;
};
// cambia el valor de un item
this.setItem = function(index,item){
if(item==null) item="";
if(0<=index && index<this.elements.length)
this.elements[index] = item;
};
// obtiene unos valores en un rango pedido: array.getRange(2,4)
this.getRange = function(from,to){
var ret = null;
if(from<=to && 0<=from && to<this.elements.length)
// a slice hay que decirle en el "to" que uno mas, porque es a partir
// de donde corta
ret = this.elements.slice(from,to+1);
return ret;
}
// para ver el tipo de objeto que es
this.getType="JSONArray";
}
// Ahora probamos ambas clases
// creamos el objeto: '{"obj1":"valor1","obj2":"valor2","obj3":"valor3"}';
// creamos el array: '["item1","item2","item3","item4"]';
var object = new JSONObject();
object.addObject("key1","value1");
object.addObject("key2","value2");
object.addObject("key3","value3");
object.addObject("key4","value4");
var array = new JSONArray();
array.addItem(2);
array.addItem("item1");
array.addItem(4);
array.addItem("item2");
document.write(object.toString()+"
");
document.write(array.toString()+"
");
object.addObject("array!",array);
document.write(object.toString()+"
");
object.setKeyByName("key3","3yek");
document.write(object.toString()+"
");

Las salidas que se obtienen son las siguientes:

{"key1":"value1","key2":"value2","key3":"value3","key4":"value4"}
[2,"item1",4,"item2"]
{"key1":"value1","key2":"value2","key3":"value3","key4":"value4","array!":[2,"item1",4,"item2"]}
{"key1":"value1","key2":"value2","3yek":"value3","key4":"value4","array!":[2,"item1",4,"item2"]}


No solo para enviar datos entre cualquier plataforma y lenguajes sirve JSON, usando esto con AJAX, tenemos lo que llaman JSON-RPC, sí las llamadas a procedimientos remotos utilizando como plataforma de intercambio de datos a JSON. De modo que, por ejemplo con el mundo Java, tenemos JSON-RPC-Java que es una tecnología que permite realizar comunicaciones Ajax entre el cliente y el servidor J2EE, hacer llamadas a funciones de clases Java desde JavaScript, con capacidad para serializar objetos Java y convertirlos en objetos JavaScript y todo ello, de forma transparente al programador. He encontrado un ejemplo bastante exhaustivo sobre este tema, con el cual veo una tontería escribir nada aquí, de modo que os pongo el enlace y si tenéis curiosidad pues le pegáis un vistacillo :D:
http://www.ateneatech.com/blog/json-rpc-java-comunicaciones-ajax-transparentes-tutorial-completo-y-ejemplos

No hay comentarios:

Publicar un comentario