首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Play Framework:如何在验证JSON的同时将字符串转换为数字

Play Framework:如何在验证JSON的同时将字符串转换为数字
EN

Stack Overflow用户
提问于 2015-04-17 09:34:56
回答 1查看 1.7K关注 0票数 3

给定以下JSON..。

代码语言:javascript
运行
复制
{
    "ask":"428.00",
    "bid":"424.20"
}

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

代码语言:javascript
运行
复制
{
    "ask": 428.00,
    "bid": 424.20
}

为此,我创建了一个验证器,它读取字符串值并将其传递给方法toNumber,该方法验证并转换给定的字符串:

代码语言:javascript
运行
复制
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提供的解决方案:

代码语言:javascript
运行
复制
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))
      }
    }
  )
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-17 12:21:37

如果您将toNumber改为Reads[JsNumber]而不是Reads[Double] (简单地将number包装在JsNumber中),则可以将transformupdate一起使用。

代码语言:javascript
运行
复制
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 这里的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29695520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档