Типы динамических типов в Groovy

Основной вопрос: Какие операторы, свойства и т. д. можно использовать для определения типа переменных в Groovy?

Фон:

У меня произвольно глубоко вложенная структура данных словаря. Это результат вызова request.JSON в контроллере Grails. Сначала я хотел бы проверить, есть ли в словаре определенные ключи с соответствующими типами. Я хотел бы реализовать это путем создания прототипа структуры данных и определения метода сравнения структур данных. Что-то вроде:

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

Конечно, содержимое строк здесь не имеет значения. Затем в своих действиях я проверяю так:

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

Итак, что же делает метод similarDataStructure? В псевдокоде:

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
}

Если вы можете придумать лучший способ сделать глубокую проверку, дайте мне знать.


person Mickey Ristroph    schedule 07.08.2009    source источник
comment
При дальнейших размышлениях я обнаружил, что на самом деле пытаюсь реализовать валидатор схемы JSON для Grails.   -  person Mickey Ristroph    schedule 11.08.2009


Ответы (1)


Для получения типов можно использовать a.class, b.class и сравнивать их: if(a.class == b.class) { }

Чтобы проверить, является ли это словарем, вы можете позвонить: a instanceof Map.

Однако попробуйте следующий код в консоли Groovy, чтобы убедиться в этом ;-)

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
person chanwit    schedule 08.08.2009