如果捕获JsonParse错误,如何继续编程

时间:2016-06-21 07:36:46

标签: json scala try-catch json4s

首先 - 抱歉愚蠢的问题。 我从DB获得了一些Json字符串,并希望用json4s解析所有这些字符串:

val df = sqlContext.sql("SELECT * FROM analytic.test").repartition(22)
val df_base = df.map(f => {
  implicit val formats = DefaultFormats
  val jsonString = f(5).toString
  val tempJSON = parse(jsonString)
  val mainJsonArray = tempJSON \ "events"
  (
    f(2).toString,
    makeEventArray(mainJsonArray)
  )
}).cache()

一切都很好,我得到了Json's,但有时在DB中出现了一些失败的Json,这让我误以为:

com.fasterxml.jackson.core.JsonParseException: Unexpected end-of-input: was expecting closing '"' for name

第一个问题 - 如何用腐败的Json躲避这一行并继续我的程序?

我尝试使用try \ catch环绕解析,但在这种情况下:

var tempJSON = json4s.JsonAST.JValue
try {
  tempJSON = parse(f(5).toString)
} catch {
  case e: Exception => println("Error on JSON parser. " + e )
}

但是犯了错误:

Error:(51, 25) type mismatch;
found: org.json4s.JValue (which expands to) org.json4s.JsonAST.JValue
required: org.json4s.JsonAST.JValue.type tempJSON = parse(f(5).toString)
                                                 ^

第二个问题 - 如何宣布tempJson对吗?

或者我必须在解析前验证Json?怎么样?

3 个答案:

答案 0 :(得分:4)

您可以使用Try

val tempJSON = Try(parse(f(5).toString))

现在,你可以match

tempJSON match {
  case Success(yourValue) => ???
  case Failure(exception) => println(exception.getMessage)
}

或者,如果您不需要例外,则可以将其转换为Option

tempJSON.toOption

您将获得NoneSome(value)

答案 1 :(得分:1)

我不知道json4s但它可能存在,例如在Play Json中,validate函数返回类似JsErrorJsSuccess的内容。

否则,另一种方法是返回Option[JValue](如果您不想处理异常),即:

def function: Option[JValue] = {
  try {
    Option(parse(f(5).toString))
  } catch {
    case e: Exception => None
  }
}

答案 2 :(得分:0)

如果你想捕获所有解析错误并默默跳过它们,这在大多数情况下都是冒险和不明智的。 你可以这样做:

df.flatMap(f =>尝试(做某事).toOption)

您可能更喜欢,早期验证可以阻止此操作,仅捕获更具体的错误,记录错误等。