Play框架:如何在验证JSON时将字符串转换为数字 [英] Play Framework: How to convert strings to numbers while validating JSON
问题描述
给出以下JSON.
{
"ask":"428.00",
"bid":"424.20"
}
...我需要将ask
和bid
的值转换为数字:
... I need to convert the values of ask
and bid
to numbers:
{
"ask": 428.00,
"bid": 424.20
}
为此,我创建了一个验证程序,该验证程序读取字符串值并将其传递给方法toNumber
,该方法验证并转换给定的字符串:
To do that, I've created a validator that reads the string value and passes it to method toNumber
, which validates and converts the given string:
def validate = (
((__ \ 'ask).json.pickBranch(Reads.of[JsString] <~ toNumber)) ~
((__ \ 'bid).json.pickBranch(Reads.of[JsString] <~ toNumber))
).reduce
private def toNumber(implicit reads: Reads[String]) = {
Reads[Double](js =>
reads.reads(js).flatMap { value =>
parse[Double](value) match {
case Some(number) => JsSuccess(number)
case _ => JsError(ValidationError("error.number", value))
}
}
)
}
上面的代码仅验证值,但当然不会用转换后的数字替换原始字符串.验证时如何将字符串值转换为数字?
The code above only validates the value but of course does not replace the original string with the converted number. How do I convert string values to numbers while validating?
编辑
只想分享Ben提供的解决方案:
Just wanted to share the solution provided by Ben:
def validate = (
((__ \ 'ask).json.update(toNumber)) ~
((__ \ 'bid).json.update(toNumber))
).reduce
private def toNumber(implicit reads: Reads[String]) = {
Reads[JsNumber](js =>
reads.reads(js).flatMap { value =>
parse[Double](value) match {
case Some(number) => JsSuccess(JsNumber(number))
case _ => JsError(ValidationError("error.number", value))
}
}
)
}
推荐答案
如果将toNumber
设置为Reads[JsNumber]
而不是Reads[Double]
(只需将number
包装在JsNumber
中),则可以使用transform
和update
:
If you make toNumber
a Reads[JsNumber]
instead of a Reads[Double]
(simply by wrapping number
in JsNumber
), then you can use transform
together with update
:
val transformer = (__ \ "ask").json.update(toNumber)
val json = Json.parse(""" { "ask" : "44" } """)
json.transorm(transformer) //JsSuccess({"ask":44.0},/ask)
val json = Json.parse(""" { "ask" : "foo" } """)
json.transorm(transformer) //JsError(List((/ask,List(ValidationError(error.number,WrappedArray(foo))))))
从某种意义上说,变形器是验证器.您可以使用transform
来简单地转换值,而不是先检查某些内容是否有效然后进行转换,如果转换无效,则可以获取JsError
.在transform
此处上了解更多信息.
In a sense, transformers are validators. Instead of checking if something is valid, and then transforming it, you can use transform
to simply transform the value, and get a JsError
if the transformation is invalid. Read more about transform
here.
这篇关于Play框架:如何在验证JSON时将字符串转换为数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!