2013-08-29 54 views
6

Đọc qua số article này, tôi không thể tìm ra cách chuyển đổi Some(JsValue) thành Chuỗi.Chuyển đổi JsValue thành Chuỗi

Ví dụ:

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

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

lỗi 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

Nếu bạn chắc chắn có một JsString: maybeString.map (_. ToString) –

Trả lời

5

Bạn muốn soạn nhiều tùy chọn, đó là những gì flatMap dành cho:

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

Hoặc như một cho sự hiểu biết:

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

Tôi cũng muốn khuyên để làm việc với các giá trị bên trong bản đồ và vượt qua tùy chọn xung quanh, do đó, None sẽ không được xử lý bởi bộ điều khiển của bạn và được ánh xạ tới một ví dụ BadRequest.

+0

OK - triển khai đầu tiên của bạn đã thành công đối với tôi. Tôi đã sử dụng 'asOpt [Long]' thay vì 'asOpt [String]' không khớp, tức là trả về "0" –

+0

cố gắng tránh sử dụng lời khuyên 'get' hoặc 'getOrElse' – Niels

+0

Xấu là xấu? –

3

lỗi của bạn xuất phát từ thực tế là bạn không áp đặt đủ điều kiện vào loại x: maybeString là một Option[JsValue], không Option[JsString] . Trong trường hợp maybeString không phải là Option[JsString], chuyển đổi không thành công và tăng và ngoại lệ.

Bạn có thể làm điều này:

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

Hoặc bạn có thể sử dụng asOpt[T] thay vì as[T], mà trả về Some(_.as[String]) nếu việc chuyển đổi thành công, None khác.

+0

Vâng, nếu tôi có 'Tùy chọn [JsValue]', làm thế nào tôi có thể chuyển đổi nó thành một 'Chuỗi'? –

+0

@Kevin 'maybeString.map (_. ToString) .getOrElse (" defaultString ")', nhưng điều đó sẽ biến đổi tất cả 'Some [JsValue]' (nghĩa là chỉ cho bạn "defaultString" khi 'existingString' rỗng). Tôi nghĩ từ câu hỏi của bạn, bạn muốn nhận được biểu diễn chuỗi nếu 'Option [JsValue]' xảy ra là 'Some [JsString]' và nhận giá trị mặc định khác. – Marth

+0

(quá chậm để chỉnh sửa bình luận trước đó) Nó sẽ cung cấp cho bạn "defaultString" chỉ khi 'có thể là' none' * – Marth