如果捕获 JsonParse 错误如何继续程序
How to continue program if catch JsonParse error
首先 - 很抱歉提出愚蠢的问题。
我从数据库中得到了一些 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,但有时在数据库中会出现一些失败 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?怎么样?
我不知道 json4s
但它可能存在,例如 Play Json
,一个 validate
函数 return 类似 JsError
或JsSuccess
.
否则,另一种方法是 return 和 Option[JValue]
(如果您不想处理异常),即:
def function: Option[JValue] = {
try {
Option(parse(f(5).toString))
} catch {
case e: Exception => None
}
}
如果您想捕获所有解析错误并静静地跳过它们,这在大多数情况下都是有风险且不明智的。
你可以简单地做:
df.flatMap(f => 尝试(做某事).toOption)
然而,您可能更喜欢,更早的验证防止这种情况开始,仅捕获更具体的错误,记录错误等。
你可以用Try
来做:
val tempJSON = Try(parse(f(5).toString))
所以现在,您可以 match
它:
tempJSON match {
case Success(yourValue) => ???
case Failure(exception) => println(exception.getMessage)
}
或者,如果您不需要异常,您可以将其转换为 Option
:
tempJSON.toOption
您将获得 None
或 Some(value)
。
首先 - 很抱歉提出愚蠢的问题。 我从数据库中得到了一些 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,但有时在数据库中会出现一些失败 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?怎么样?
我不知道 json4s
但它可能存在,例如 Play Json
,一个 validate
函数 return 类似 JsError
或JsSuccess
.
否则,另一种方法是 return 和 Option[JValue]
(如果您不想处理异常),即:
def function: Option[JValue] = {
try {
Option(parse(f(5).toString))
} catch {
case e: Exception => None
}
}
如果您想捕获所有解析错误并静静地跳过它们,这在大多数情况下都是有风险且不明智的。 你可以简单地做:
df.flatMap(f => 尝试(做某事).toOption)
然而,您可能更喜欢,更早的验证防止这种情况开始,仅捕获更具体的错误,记录错误等。
你可以用Try
来做:
val tempJSON = Try(parse(f(5).toString))
所以现在,您可以 match
它:
tempJSON match {
case Success(yourValue) => ???
case Failure(exception) => println(exception.getMessage)
}
或者,如果您不需要异常,您可以将其转换为 Option
:
tempJSON.toOption
您将获得 None
或 Some(value)
。