【问题标题】:How to continue program if catch JsonParse error如果捕获 Json Parse 错误,如何继续程序
【发布时间】:2016-06-21 07:36:46
【问题描述】:

首先 - 抱歉这个愚蠢的问题。 我从 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,但有时在 DB 中会出现一些失败的 Json,这会让我出错:

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

第一个问题 - 如何使用损坏的 Json 避开这一行并继续我的程序?

我尝试用 try\catch 包围 parse,但在这种情况下:

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?怎么样?

【问题讨论】:

    标签: json scala try-catch json4s


    【解决方案1】:

    您可以使用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)

    【讨论】:

    • 谢谢!正是我要找的东西
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      df.flatMap(f => Try(do something).toOption)

      但是,您可能更喜欢早期验证以防止这种情况开始,仅捕获更具体的错误,记录错误等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 1970-01-01
        相关资源
        最近更新 更多