1

这是一个简单的问题,我无法弄清楚:

以下代码给出以下编译错误:

def parseJson(q: String) = Option[JsValue]{
    try{
            Json.parse(q)
    }catch{
        case e: com.codahale.jerkson.ParsingException => None
    }
}

错误

[error]  found   : None.type (with underlying type object None)
[error]  required: play.api.libs.json.JsValue
[error]             case e: com.codahale.jerkson.ParsingException => None

考虑到我的响应类型是 Option[JsValue],为什么我不能返回 None?

4

2 回答 2

10

您实际上希望将 Json.parse(q) 放入 Some() 而不是将整个代码包装在 Option[JsValue] 中,而是将其用作签名:

def parseJson(q: String): Option[JsValue] = {
    try{
       Some(Json.parse(q))
    }catch{
       case e: com.codahale.jerkson.ParsingException => None
    }
}

但无论如何,您应该更喜欢使用scala.util.control.Exception

 import scala.util.control.Exception._
 catching(classOf[com.codahale.jerkson.ParsingException]).opt(Json.parse(q))
于 2013-01-17T17:44:48.730 回答
1

我认为您只是方法定义的语法错误。您编写它的方式是调用Option.applytry/catch 块的结果。我想你的意思是写这个:

def parseJson(q: String): Option[JsValue] = {
  try {
    Some(Json.parse(q))
  } catch {
    case e: com.codahale.jerkson.ParsingException => None
  }
}
于 2013-01-17T17:41:02.907 回答