2016-06-21 6 views
0

Vor allem - Entschuldigung für dumme Frage. ich einige Json Zeichenfolge von DB bekam und wollen alle mit json4s analysieren:Wie Programm fortsetzen, wenn fangen JsonParse Fehler

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() 

alles gut, ich erhielt Json ist, aber manchmal in DB einige gescheitert Json auftritt, dass Sie mich treffen, um Fehler:

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

Erste Frage - Wie kann ich diese Zeile mit beschädigten Json umgehen und mein Programm fortsetzen?

versuche ich Surround Parse mit try \ fangen, aber in diesem Fall:

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

Aber Fehler einnehmende:

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) 
               ^

Zweite Frage - Wie tempJson Recht zu erklären?


Oder muss ich Json vor dem Parsen validieren? Wie?

Antwort

2

Sie Try dafür verwenden können:

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

jetzt So können Sie match es:

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

Oder, wenn Sie die Ausnahme nicht benötigen, würden Sie es zu Option konvertieren:

tempJSON.toOption 

Sie None oder Some(value) bekommen.

+0

Danke! Genau das, wonach ich suche – ANTVirGEO

1

Ich weiß nicht, json4s aber es existiert wahrscheinlich, wie in Play Json, eine validate Funktion Rückkehr so ​​etwas wie ein JsError oder JsSuccess.

Andernfalls eine andere Art und Weise zu gehen, ist eine Option[JValue] zurückzukehren (wenn Sie nicht mit Ausnahmen behandeln wollen), dh:

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

Wenn Sie alle Parsing-Fehler fangen wollen, und sie lautlos überspringen Das ist riskant und in den meisten Fällen schlecht beraten. Sie können einfach tun:

df.flatMap (f => Versuchen (etwas tun) .toOption)

Sie können jedoch bevorzugen, frühere Validierung dies zu beginnen verhindern, nur eine spezifischere Fehler zu kontrollieren, Protokollierung Fehler usw.