2009-08-07 8 views
1

Question principale: Quels opérateurs, propriétés, etc. peuvent être utilisés pour déterminer le type de variables dans Groovy?Types de types dynamiques dans Groovy

Contexte:

J'ai une structure de dictionnaire de données arbitrairement profondément imbriquées. C'est le résultat de l'appel request.JSON dans un contrôleur Grails. Je voudrais d'abord vérifier que certaines clés sont dans le dictionnaire, avec les types appropriés. La façon dont je voudrais mettre en œuvre ceci est en créant une structure de données prototypique et en définissant une méthode pour comparer les structures de données. Quelque chose comme:

def prototype = [ username: "JennyJeans", 
        message: [ subject: "Hello World!", 
           body: "Will write soon." 
          ] 
       ] 

Bien sûr, le contenu des chaînes ici n'a pas d'importance. Puis, dans mes actions, je valide comme ceci:

if(similarDataStructure(prototype, request.JSON)) { 
// XXX 
} else { 
// report error 
} 

Alors, qu'est-ce que la méthode similarDataStructure faire? Dans pseudocode:

def similarDataStructure(a, b) { 
    if(type(a) != type(b)) return false 

    if(type(a) == dictionary) { 
    for key in a: 
     if(!similarDataStructure(a[key], b[key])) return false 
    } 

    return true 
} 

Si vous pouvez trouver une meilleure façon de faire une validation approfondie, faites le moi savoir.

+0

En plus la pensée, je l'ai découvert ce que je suis vraiment en train de mettre en œuvre un schéma JSON validateur pour Grails –

Répondre

1

Pour obtenir les types, vous pouvez utiliser a.class, b.class et de les comparer: if(a.class == b.class) { }

Pour vérifier si elle est un dictionnaire, vous pouvez appeler: a instanceof Map.

Cependant, essayez le code suivant dans la console Groovy pour voir vous-même ;-)

def src = [ username: "JennyJeans", 
      message: [ subject: "Hello World!", 
         body: "Will write soon."] 
     ] 

def p1 = [ username: "JennyJeans", 
      message: [ subject: "Hello World!", 
         body: "Will write soon."] 
     ] 

def p2 = [ username: "JennyJeans", 
      message: [ subject: "Hello World!", 
         body: "Will read soon."] 
     ] 

println src == p1 
println src == p2