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!

2 comentarios:

  1. Acabo de ver que los corchetes de los objetos json no tienen comas!, luego que tenga tiempo lo corrijo y vuelvo a subir
    la idea principal igual si esta (la recursividad)

    ResponderEliminar
  2. De esta manera se soluciona el problema de la coma.

    int count = 0;

    for......


    if(count==0){
    sb.append("{");
    }else{
    sb.append(",{");
    }

    ....

    count++;

    ResponderEliminar