使用play-json库捕获Json异常

时间:2014-07-11 00:35:38

标签: scala playframework

play-json的{​​{1}}方法可能会抛出Json.parse()。它也可能抛出JsonMappingException。为了捕获这些例外,是否必须进入JsonParseException

我从文档中了解到,play-json是建立在Jerkson之上的,这是杰克逊的包装。

捕获播放库抛出的异常似乎更为理智,而不是通过它使用的包,它感觉就像通过抽象来深入了解。有没有更好的办法? play-json库是否应该包装这些错误以获得更好的抽象?

这个问题适用于Scala。

1 个答案:

答案 0 :(得分:9)

我同意在parse上拥有Json的安全风味可能会很好,但它主要关注的是编码和解码,而不是序列化和反序列化(如果你看一下它的顶部 - 例如,ScalaDoc级别描述,您将看到以下内容:" Helper函数用于处理JsValues",而不是"来处理JSON字符串")。

一般来说,从StringJsValue的转换应该更接近程序的边界,如果你看看如何在Play中处理传入的JSON,你会看到有安全的选择(例如request.body.asJson)。

Play可能很方便将杰克逊的例外情况包装起来,以避免暴露实施细节,但你绝对不需要"进入"杰克逊在任何意义上都可以捕获这些异常 - 只需将parse中的Try来电话包裹起来:

import play.api.libs.json._
import scala.util.Try

val parsed: Try[JsValue] = Try(Json.parse("{ broken"))

或者:

val decoded: Option[Map[String, Int]] = Try(
  Json.parse("""{ "foo": 1 }""")
).toOption.flatMap(_.asOpt[Map[String, Int]])

等等。