Play Framework:在验证JSON时将字符串转换为数字是不起作用的



给定以下JSON。。。

{
"ask":"428.00",
"bid":"424.20"
}

我需要将askbid的值转换为数字:

{
"ask": 428.00,
"bid": 424.20
}

正如这里已经讨论过的,我只需要创建一个这样的验证器:

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))
}
}
)
}

问题是只有最后一个节点(bid)被实际转换为数字。。。生成的JSON如下所示:

}
"ask":"428.00",
"bid":424.20
}

我是不是错过了什么?

编辑

只有当JSON结构只包含要转换为数字的字符串时,才可以使用andThen。。。而如果JSON结构已经包含数字字段,则不会。给定以下JSON[last已经是数字]:

}
"ask":"428.00",
"bid":"424.20",
"last": 430.05
}

如果我这样修改我的验证器[用andThen替换~并删除reduced]。。。

def validate = (
((__  'ask).json.update(toNumber)) andThen
((__  'bid).json.update(toNumber)) andThen
((__  'last).json.pickBranch(Reads.of[JsNumber]))
)

然后我在尝试验证上面的JSON时得到以下错误:

JsError(List((/bid/last,List(ValidationError(error.path.missing,WrappedArray())))))

查看文档时,似乎应该使用"andThen",而不是"~"。参见"案例7"。

最新更新