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;