2014-07-11 8 views
6

play-json 's metodo Json.parse() può lanciare un JsonMappingException. Può anche lanciare un JsonParseException. Al fine di cogliere queste eccezioni, è necessario raggiungere com.fasterxml.jackson?Catching Eccezioni JSON con libreria json-play

Capisco dalla documentazione che play-json è costruito su Jerkson che è un wrapper attorno a Jackson.

Sembra molto più sicuro cogliere un'eccezione generata dalla libreria di giochi piuttosto che da un pacchetto che utilizza, che sembra di arrivare giù attraverso l'astrazione. C'è un modo migliore? Dovrebbe la libreria di gioco-json avvolgere questi errori per una migliore astrazione?

Questa domanda è per Scala.

risposta

6

Sono d'accordo che sarebbe probabilmente bello avere un aroma sicuro di parse su Json, ma il suo obiettivo principale è la codifica e la decodifica, non la serializzazione e la deserializzazione (se si guarda la descrizione di ScalaDoc di primo livello, ad esempio, vedrai quanto segue: "Funzioni di supporto per gestire JsValues", non "per gestire stringhe JSON").

In generale ottenere da un String ad un JsValue dovrebbe accadere più vicino ai confini del vostro programma, e se si guarda a come entrata JSON è gestita in Play, vedrete che ci sono opzioni di sicurezza (ad esempio request.body.asJson).

sarebbe anche probabilmente utile per Play per avvolgere le eccezioni Jackson per evitare di esporre i dettagli di implementazione, ma sicuramente non c'è bisogno di "raggiungere nel" Jackson in nessun senso per la cattura di queste eccezioni, proprio avvolgere la chiamata a parse in un Try:

import play.api.libs.json._ 
import scala.util.Try 

val parsed: Try[JsValue] = Try(Json.parse("{ broken")) 

Oppure:

val decoded: Option[Map[String, Int]] = Try(
    Json.parse("""{ "foo": 1 }""") 
).toOption.flatMap(_.asOpt[Map[String, Int]]) 

E così via.

+0

'Try' funziona. Grazie. Non sto usando questo in un contesto web, quindi 'request.body.asJson' non è un'opzione. – user650654