如何在spray json中为Boolean类型实现自定义反序列化器

时间:2016-01-20 10:24:57

标签: json scala spray spray-json

我的API模型中有几个Boolean属性,并希望接受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不被视为布尔值。任何解决方案?

1 个答案:

答案 0 :(得分: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")
        }
    }
}