2016-06-21 40 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)

然而,你可能更喜歡較早驗證防止此,首先,捕只有更具體的錯誤,記錄錯誤等

相關問題