2014-02-18 2 views
1

В следующем операторе, pickBranch возвращает Reads ...Play Framework: * pickBranch * и * или *

((__ \ 'firstName).json.pickBranch) 

... на котором я могу вызвать or так:

val emptyObj = __.json.put(Json.obj()) 
((__ \ 'firstName).json.pickBranch or emptyObj) 

Если pickBranch преуспевает, то or возвращает результат pickBranch, в противном случае он возвращает emptyObj.

Теперь, можно вызвать or на Reads возвращенного pickBranch и передать либо emptyObj или что pickBranch вернулся?

val emptyAllowed = true 
((__ \ 'firstName).json.pickBranch or (if (emptyAllowed) emptyObj else >>>RESULT OF pickBranch<<<)) 

ответ

1

Хорошо, вот решение. Во-первых, я создал расширений объект для Reads:

package object typeExtensions { 

    import play.api.libs.json._ 
    import play.api.libs.functional.syntax._ 

    implicit class ReadsExtensions(reads: Reads[JsObject]) extends AnyVal { 

    def orEmpty = reads | __.put(Json.obj()) 
    def orEmptyIf(b: Boolean) = if (b) orEmpty else reads 
    } 
} 

А вот ниже, как использовать его:

val canBeEmpty: Boolean = true 
((__ \ 'firstName).json.pickBranch orEmptyIf canBeEmpty)) 

Для получения более подробной информации см мой полный ответ here. Надеюсь, что это поможет.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

ОК, только что добавил ;-) – j3d