2016-06-21 30 views
0

首先 - 对于愚蠢的问题感到抱歉。 我从DB一些JSON字符串,并希望与json4s解析所有的人:如何继续编程如果发现JsonParse错误

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这一行,并继续我的程序?

我试图环绕解析与尝试\赶上,但在这种情况下:

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

回答

2

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

+0

谢谢!正是我在找什么 – ANTVirGEO

1

我不知道json4s但它可能存在,像Play Json,一个validate函数返回有点像JsErrorJsSuccess

否则,别的路可走是返回一个Option[JValue](如果你不想处理例外),即:

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

如果你想捕获所有分析错误并自动跳过它们在大多数情况下,这是风险和不适当的建议。 你可以简单地做:

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

然而,你可能更喜欢较早验证防止此,首先,捕只有更具体的错误,记录错误等

相关问题