Mostrando entradas con la etiqueta JSON. Mostrar todas las entradas
Mostrando entradas con la etiqueta JSON. Mostrar todas las entradas

jueves, 20 de noviembre de 2014

Crear un arbol en json desde lista en Java

Directo al punto!
Tenemos una lista en Java en forma de árbol y queremos convertirla a json para usarla en el front-end

List<Especialidad> treeEspecialidades = new ArrayList<Especialidad>();

El objeto Especialidad vendría siendo el nodo del árbol, y dentro tiene una lista de hijos (de tipo Especialidad también), y la lista de treeEspecialidades es la lista de los nodos raíz.
Podemos usar el modo rápido, y convertir el árbol a json con alguna librería que convierta el java a json

 String json = JSONFactoryUtil.serialize(treeEspecialidades);  

(en este caso JSONFactoryUtil esta en las librerías core de Liferay)
Lo malo de este método es que al ser una lista de objetos, crea mucha basura en el json, que no va a ser usada nunca.

Para crear el objeto json con los datos que se quieren y el formato que se requiera para usarlo en el front-end, se crea un método recursivo. Éste recorre todo el árbol y lo convierte a json:

 private String convertTreeToJson(List<Especialidad> treeEspecialidades){  
           if(treeEspecialidades==null){  
                return "";  
           }  
           StringBuffer sb = new StringBuffer();  
           for(Especialidad especialidad: treeEspecialidades){  
                sb.append("{");  
                sb.append("id:\""+especialidad.getEspecialidadId()+"\",");  
                if(especialidad.getParent()!=null){  
                     sb.append("parent:\""+especialidad.getParent().getEspecialidadId()+"\",");  
                }else{  
                     sb.append("parent:\"#\",");  
                }  
                sb.append("text:\""+especialidad.getEspecialidad()+"\",");  
                if(especialidad.getHijos()!=null){  
                     sb.append(convertTreeToJson(especialidad.getHijos()));  
                }  
                sb.append("}");  
     }  
           return sb.toString();  
}  

Éste método devuelve un json a manera de árbol, por ejemplo:

 {  
   id: "1",  
   parent: "#",  
   text: "Energética",  
   {  
     id: "2",  
     parent: "1",  
     text: "Petróleo y Gas",  
   } {  
     id: "10",  
     parent: "1",  
     text: "Luz y Fuerza",  
     {  
       id: "11",  
       parent: "10",  
       text: "Luz",  
       {  
         id: "12",  
         parent: "11",  
         text: "Luz calle",  
         {  
           id: "13",  
           parent: "12",  
           text: "Luz de luces",  
         }  
       }  
     }  
   }  
 } {  
   id: "3",  
   parent: "#",  
   text: "Tecnología",  
   {  
     id: "5",  
     parent: "3",  
     text: "Desarrollo de sismtemas",  
     {  
       id: "6",  
       parent: "5",  
       text: "Programador Java",  
     } {  
       id: "9",  
       parent: "5",  
       text: "Programador .Net ligeramente mucho texto de prueba",  
     }  
   }  
 } {  
   id: "4",  
   parent: "#",  
   text: "Mercadotécnia",  
   {  
     id: "7",  
     parent: "4",  
     text: "Merca 2",  
     {  
       id: "8",  
       parent: "7",  
       text: "Hoja Merca",  
     }  
   }  
 }  

Espero le sirva a alguien!

martes, 6 de mayo de 2014

Ordenar objeto JSON alfabéticamente por cualquier atributo

Me topé con una situación en la que necesitaba ordenar un JSON alfabéticamente, una vez mas, StackOverflow me sacó del apuro.
La opción mas votada esta muy buena, puedes ordenar por cualquier atributo y en cualquier orden.
Les dejo el link a esta respuesta:
http://stackoverflow.com/a/4698083

 function sortJsonArrayByProperty(objArray, prop, direction){  
   if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments");  
   var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending  
   if (objArray && objArray.constructor===Array){  
     var propPath = (prop.constructor===Array) ? prop : prop.split(".");  
     objArray.sort(function(a,b){  
       for (var p in propPath){  
         if (a[propPath[p]] && b[propPath[p]]){  
           a = a[propPath[p]];  
           b = b[propPath[p]];  
         }  
       }  
       // convert numeric strings to integers  
       a = a.match(/^\d+$/) ? +a : a;  
       b = b.match(/^\d+$/) ? +b : b;  
       return ( (a < b) ? -1*direct : ((a > b) ? 1*direct : 0) );  
     });  
   }  
 }  
 sortJsonArrayByProperty(results, 'attributes.OBJECTID');  
 sortJsonArrayByProperty(results, 'attributes.OBJECTID', -1);  
En las ultimas 2 lineas se manda llamar la funcion de orden ascendente y descendente, ordenandolo por el OBJECTID

Teniendo el JSON de ejemplo:

 {"results": [  
  {  
   "layerId": 5,  
   "layerName": "Pharmaceutical Entities",  
   "attributes": {  
    "OBJECTID": "35",  
    "FACILITYTYPE": "Pharmacy",  
    "FACILITYSUBTYPE": "24 Hr Pharmacy",  
    "COMMERCIALNAME_E": "SADD MAARAB PHARMACY",  
    },  
   "geometryType": "esriGeometryPoint",  
   },  
  {  
   "layerId": 5,  
   "layerName": "Pharmaceutical Entities",  
   "attributes": {  
    "OBJECTID": "1",  
    "FACILITYTYPE": "Pharmacy",  
    "FACILITYSUBTYPE": "24 Hr Pharmacy",  
    "COMMERCIALNAME_E": "GAYATHY HOSPITAL PHARMACY",  
   },  
   "geometryType": "esriGeometryPoint",  
  },  
    {  
   "layerId": 5,  
   "layerName": "Pharmaceutical Entities",  
   "attributes": {  
    "OBJECTID": "255",  
    "FACILITYTYPE": "Pharmacy",  
    "FACILITYSUBTYPE": "24 Hr Pharmacy",  
    "COMMERCIALNAME_E": "AL DEWAN PHARMACY",  
    },  
   "geometryType": "esriGeometryPoint",  
   }  
 ]}