I think your problem is that you want to be able to map the map that you get from parseFull(), but Map does not have unapply.
Thus, you can match each individual value with a default value if it does not match the type:
val templateText: Option[String] = e("template-text") match {
case s: String => Some(s)
case _ => None
}
, :
val data = (e("template-text"), e("template-html"), e("email"), e("data"),
e("blkdata"))
val dependencies: Option[Data] = data match {
case (templateText: String,
templateHtml: String,
blockMaps: Map[String,List[Map[String,String]]],
templateMap: Map[String,String]) =>
Some(new Data(recipient, templateText, templateHtml, blockMaps, templateMap))
case _ => None
}