2016-06-21 3 views
0

우선 - 어리석은 질문에 대한 죄송합니다. 내가 DB에서 일부 JSON 문자열을 얻고 json4s으로 그들 모두를 구문 분석 할 :catch하는 경우 프로그램을 계속하는 방법 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 수 그것을 :

당신은 예외가 필요하지 않은 경우

6,또는, 당신은 Option로 변환합니다 :

tempJSON.toOption 

당신은 None 또는 Some(value)를 얻을 수 있습니다.

+0

감사합니다. 정확히 내가 찾고있는 것 – ANTVirGEO

1

나는 json4s 모르지만 아마, Play Json에서처럼 JsError 또는 JsSuccess 같은 validate 기능 반환 뭔가 존재한다.

그렇지 않으면 갈 수있는 다른 방법은 (당신이 예외를 처리하지 않으려는 경우), Option[JValue]을 반환하는 것입니다 예 : 모든 구문 분석 오류를 포착하고 자동으로이를 생략 할 경우

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

이는 대부분의 경우 위험하고 약하게 권고합니다. 당신은 간단하게 수행 할 수 있습니다

df.flatMap 자세한 오류 만 로깅을 잡기로 시작이 방지, 당신은 그러나 선호 할 수도

을 이전 검증 (F은 =>) .toOption을 무언가를 (시도) 오류 등

관련 문제