Algo que se suele tener que hacer cuando se usan modelos de
comunicación basados en JSON es las deserialización de strings a
objetos en el lenguaje en que esté programada la aplicación en el servidor.
En el caso de zylk.net lo normal
es usar Java como lenguaje de servidor, para la
serialización/deserialización de objetos en JSON solemos usar flexjson. La serialización
y deserialización de objetos es más o menos secillas con esta
librería, pero hay un caso que aunque sencillo es interesante explicar.
Supongamos que tenemos un Bean de java (atributos y getters and
setters), por ejemplo una calle que se define con el siguiente bean
public class Calle {
public Calle(String descripcionOficial, String id) {
super();
this.descripcionOficial = descripcionOficial;
this.id = id;
}
private String descripcionOficial;
private String id;
public String getDescripcionOficial() {
return descripcionOficial;
}
public void setDescripcionOficial(String descripcionOficial) {
this.descripcionOficial = descripcionOficial;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
E imaginemos que existe un servicio REST/JSON que devuelve un array de estos
objetos algo como:
[{descripcionOficial:"calle
1",id:"123456"},
{descripcionOficial:"calle
2",id:"123457"},
{descripcionOficial:"calle 3",id:"123458"}]
Si necesitamos crear un array de este tipo de beans en java basta
con hacer uso de los deserializadores la librería flexjson de la
siguiente manera
List<Calle> calles = null;
calles = new JSONDeserializer<List<Calle>>().use( "values", Calle.class ).deserialize(jsonString);
Donde le estamos indicando al deserializador que el string
jsonString es una Lista
JSONDeserializer<List<Calle>>() y que
los elementos que componen esta lista son los beans tipo Calle
.use( "values", Calle.class )
Update:
Se hace de manera equivalente usando las clases del
kernel de liferay que son wrappers sobre flexjson
JSONDeserializer<List<Test>> a = JSONFactoryUtil.createJSONDeserializer(); List<Test> b = a.use("values", Test.class).deserialize(s);
Pero usando los siguientes imports:
import com.liferay.portal.kernel.json.JSONDeserializer; import com.liferay.portal.kernel.json.JSONFactoryUtil;