【发布时间】:2015-04-17 09:34:56
【问题描述】:
鉴于以下 JSON..
{
"ask":"428.00",
"bid":"424.20"
}
...我需要将ask和bid的值转换为数字:
{
"ask": 428.00,
"bid": 424.20
}
为此,我创建了一个验证器,它读取字符串值并将其传递给方法toNumber,该方法验证并转换给定的字符串:
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))
}
}
)
}
上面的代码只验证值,但当然不会用转换后的数字替换原始字符串。验证时如何将字符串值转换为数字?
编辑
只是想分享一下 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))
}
}
)
}
【问题讨论】:
-
有必要一步到位吗? (你想要
Try/Either作为结果吗?我认为验证的结果不适合这个任务。) -
...如果我可以验证字符串实际上包含数字...然后转换整个 JSON...
标签: json scala playframework