2010-07-08 4 views
2

je suit la cartographie représentant les catégories arbre:Groovy/Grails JSON conversion d'objets complexes et collections

class Category { 

    String name 
    static belongsTo = [parent: Category] 
    static hasMany = [categories: Category] 

} 

La chose que je veux faire est de rendre l'ensemble de l'arbre de catégorie et exclure champ parent de rendu.

render category as JSON 

rend uniquement le premier niveau de hiérarchie et ne rend pas les noms des catégories enfants. I.e. ayant arbre suivant:

Root-> cat2-> cat4 cat3

Je

{"class":"project.Category", 
"id":1, 
"categories":[{"class":"Category","id":2}, 
       {"class":"Category","id":3}], 
"name":"Root", 
"parent":null} 

Je ne veux pas "classe" et "parent" attributs et que vous souhaitez voir les données de cat4 dans cet arbre.

Existe-t-il une lib particulière ou un plugin ou peut-être est-il possible de configurer un convertisseur JSON standard ou une classe de domaine?

Répondre

0

Je pense que vous auriez à faire vous-même: -/

quelque chose comme:

def categoryToMap(cat) { 
    def a = [ id:cat.id, name:cat.name ] 
    if(cat.categories) a << [ categories:cat.categories.collect { categoryToMap(it) } ] 
    a 
} 

alors quelque chose comme:

render categoryToMap(category) as JSON 
+0

qui fera, mais les catégories arbre est au-dessus que exmapmle simple. Mais je suis à la recherche de plus universel et si possible moyen standard. – Vladimir

0

JSON-lib est une bibliothèque qui offre un contrôle serré sur le format des objets Java/Groovy sérialisés en JSON. De the docs:

Depuis la version 2.0 JSON-lib a intégré le soutien Groovy, ce qui signifie que Pogo peut être transformé en JSON et à l'arrière, de la même manière que vous le faites maintenant avec POJO.

+0

La question est en fait: COMMENT configurer cette lib? – Vladimir

+0

Mettez-le sur votre classpath soit en ajoutant le fichier JAR au répertoire/lib de votre application Grails, soit en le spécifiant en tant que dépendance dans BuildConfig.groovy –

2

Vous pouvez essayer de construire JSON custom via JSONBuilder:

render(builder:'json') { 
    id(category.id) 
name(category.name) 
    categories { 
    category.categories?.each { 
     categories (
     id: it.id, 
     name: it.name 
    ) 
    } 
    } 
}