2013-08-29 5 views
6

Czytając ten article, nie mogę dowiedzieć się, jak przekonwertować mój Some(JsValue) na ciąg.Konwersja JsValue na ciąg

Przykład:

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

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

błąd 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

Jeśli na pewno masz JsString: maybeString.map (_. ToString) –

Odpowiedz

5

Chcesz komponować wiele opcji, to co flatMap jest dla:

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

lub jako do zrozumienia:

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

Chciałbym również doradzać do pracy z wartością wewnątrz mapie i przekazuj Opcję dookoła, więc kontroler będzie obsługiwał None i mapował na przykład na BadRequest.

+0

OK - Twoje pierwsze wdrożenie było dla mnie udane. Użyłem 'asOpt [Long]' zamiast, ponieważ 'asOpt [String]' nie pasuje, tj. Zwrócił "0" –

+0

staram się unikać używania 'get' lub 'getOrElse' – Niels

+0

Zła rada jest zła? –

3

Twój błąd wynika z faktu, że nie nakładają tyle warunek typu X.: maybeString jest Option[JsValue] nie Option[JsString] . W przypadku, gdy maybeString nie jest Option[JsString], konwersja nie powiedzie się i wzrośnie i nastąpi wyjątek.

Można to zrobić:

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

Albo można użyć asOpt[T] zamiast as[T], która zwraca Some(_.as[String]) jeśli konwersja powiodła się, None inaczej.

+0

Cóż, jeśli mam 'Option [JsValue]', jak mogę przekonwertować to na 'String'? –

+0

@Kevin 'maybeString.map (_. ToString) .getOrElse (" defaultString ")', ale to przekształci wszystkie 'Some [JsValue]' (tj. Da ci "defaultString" tylko wtedy, gdy 'maybeString' jest pusty). Pomyślałem, że z twojego pytania chciałeś uzyskać reprezentację napisów, jeśli twoja 'Option [JsValue]' stała się 'Some [JsString]' i otrzymasz domyślną wartość inaczej. – Marth

+0

(zbyt wolno, aby edytować poprzedni komentarz) To da ci "defaultString" tylko wtedy, gdy 'maybeString' jest' Brak' * – Marth