Scala 定义读取[X],其中X具有专用构造函数
给定具有“智能构造函数”的Scala 定义读取[X],其中X具有专用构造函数,scala,playframework-2.0,Scala,Playframework 2.0,给定具有“智能构造函数”的Person类,即只有Person#build中的“有效”值才会构造Person: case class Person private(age: Int) object Person { def build(age: Int): Option[Person] = if (age >= 0 && age <= 125) Some(Person(age)) else None } 有更好的办法吗?如果可能的话,我更愿意
Person
类,即只有Person#build
中的“有效”值才会构造Person
:
case class Person private(age: Int)
object Person {
def build(age: Int): Option[Person] =
if (age >= 0 && age <= 125) Some(Person(age)) else None
}
有更好的办法吗?如果可能的话,我更愿意避免例外情况。如果您愿意放弃播放功能样式,您可以利用
JsResult
monad:
new Format[Person] {
override def writes(o: Person): JsValue = ???
override def reads(json: JsValue): JsResult[Person] = {
try{
json.as[JsObject].value.get("age")
.flatMap(age => Person.build(age.as[Int])).map(JsSuccess(_))
.getOrElse(JsError("wrong age"))
} catch {
case e: Exception =>
JsError("wrong age")
}
}
}
val person = Json.toJson(Person.build(30))
val parsed: \/[String, Person] = person.validate[Person].map(\/-(_)).getOrElse(-\/("some bad request"))
因此,它比我在评论中建议的要复杂一点,但基本上你可以将解析包装成一个方法,将
JsSuccess
转换为右侧,将JsError
转换为左侧,try/catch
我用来捕捉发送的json不是对象而是值的情况,或者年龄字段不是整数的情况。为什么不使用case类Person(age:Int){require(age>=0&&age以避免异常,即使用Monads而不是exceptions如何定义伴生对象中的读取?@pedrofurla-我想我已经清楚地表明,我已经将读取[Person]
添加到伴生对象中。而且,有一个相关的讨论-完全没有涉及它。
new Format[Person] {
override def writes(o: Person): JsValue = ???
override def reads(json: JsValue): JsResult[Person] = {
try{
json.as[JsObject].value.get("age")
.flatMap(age => Person.build(age.as[Int])).map(JsSuccess(_))
.getOrElse(JsError("wrong age"))
} catch {
case e: Exception =>
JsError("wrong age")
}
}
}
val person = Json.toJson(Person.build(30))
val parsed: \/[String, Person] = person.validate[Person].map(\/-(_)).getOrElse(-\/("some bad request"))