Как реализовать собственный десериализатор для типа Boolean в спрее json

У меня есть пара атрибутов Boolean в моей модели API, и я хотел бы принимать значения true/false, а также 1/0. Моей первой идеей было реализовать собственный форматтер:

object UserJsonProtocol extends DefaultJsonProtocol {

    implicit object MyBooleanJsonFormat extends JsonFormat[Boolean] {
        def write(value: Boolean): JsString = {
            return JsString(value.toString)
        }

        def read(value: JsValue) = {
            value match {
                case JsString("1") => true
                case JsString("0") => false
                case JsString("true") => true
                case JsString("false") => false
                case _ => throw new DeserializationException("Not a boolean")
            }
        }
    }

    implicit val userFormat = jsonFormat15(User.apply)
}

где User — модель с Boolean атрибутами. К сожалению, приведенное выше решение не имеет никакого эффекта - 1/0 не принимаются как логические значения. Любое решение?


person mkorszun    schedule 20.01.2016    source источник


Ответы (1)


После исправления некоторых проблем с типами и сопоставлением с образцом, похоже, это работает:

implicit object MyBooleanJsonFormat extends JsonFormat[Boolean] {
    def write(value: Boolean): JsBoolean = {
        return JsBoolean(value)
    }

    def read(value: JsValue) = {
        value match {
            case JsNumber(n) if n == 1 => true
            case JsNumber(n) if n == 0 => false
            case JsBoolean(true) => true
            case JsBoolean(false) => false
            case _ => throw new DeserializationException("Not a boolean")
        }
    }
}
person mkorszun    schedule 20.01.2016