如何在 spray 中为 Boolean 类型实现自定义反序列化器 json
How to implement custom deserializer for type Boolean in 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
不被接受为布尔值。有什么解决办法吗?
修复了一些类型和模式匹配问题后,它似乎可以工作了:
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")
}
}
}
我的 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
不被接受为布尔值。有什么解决办法吗?
修复了一些类型和模式匹配问题后,它似乎可以工作了:
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")
}
}
}