2013-08-29 18 views
6

Leggendo attraverso questo article, non riesco a capire come convertire il mio Some(JsValue) in una stringa.Conversione di JsValue in stringa

Esempio:

val maybeString: Option[JsValue] = getSomeJsValue(); // returns Some(JsValue) 

val str: String = maybeString match { 
    case Some(x) => x.as[String] 
    case _  => "0" 
} 

errore di run-time:

play.api.Application$$anon$1: Execution exception[[JsResultException: JsResultException(errors:List((,List(ValidationErr 
or(validate.error.expected.jsstring,WrappedArray())))))]] 
     at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.3] 
+0

Se si è sicuri di avere un JsString: maybeString.map (_. ToString) –

risposta

5

Si desidera comporre opzioni multiple, che è quello che flatMap è per:

maybeString flatMap { json => 
    json.asOpt[String] map { str => 
    // do something with it 
    str 
    } 
} getOrElse "0" 

O come per la comprensione:

(for { 
    json <- maybeString 
    str <- json.asOpt[String] 
} yield str).getOrElse("0") 

Mi piacerebbe anche consigliare a lavorare con il valore all'interno della mappa e passare l'Opzione in giro, quindi un Nessuno verrà gestito dal controller e mappato a un BadRequest per esempio.

+0

OK: la prima implementazione ha avuto successo per me. Ho usato 'asOpt [Long]' invece che 'asOpt [String]' non corrisponde, cioè restituito "0" –

+0

cerca di evitare di usare 'get' o 'getOrElse' – Niels

+0

I cattivi consigli sono cattivi? –

3

tuo errore deriva dal fatto che non si impongono abbastanza condizioni del tipo di x: maybeString è un Option[JsValue], non Option[JsString] . Nel caso maybeString non è un Option[JsString], la conversione non riesce e aumenta ed eccezione.

Si potrebbe fare questo:

val str: String = maybeString match { 
    case Some(x:JsString) => x.as[String] 
    case _  => "0" 
} 

Oppure si potrebbe usare asOpt[T] invece di as[T], che restituisce Some(_.as[String]) se la conversione è stata eseguita correttamente, altrimenti None.

+0

Bene, se ho "Opzione [JsValue]", come posso convertirlo in un 'String'? –

+0

@Kevin 'maybeString.map (_. ToString) .getOrElse (" defaultString ")', ma questo trasformerà tutto in 'Some [JsValue]' (cioè diamo "defaultString" solo quando 'maybeString' è vuoto). Ho pensato che dalla tua domanda avresti voluto ottenere la rappresentazione della stringa se il tuo "Option [JsValue]" fosse un 'Some [JsString]' e ottenere un valore predefinito altrimenti. – Marth

+0

(troppo lento per modificare il commento precedente) Vi darà "defaultString" solo quando 'maybeString' è' None' * – Marth