Play框架:如何在验证JSON时将字符串转换为数字 [英] Play Framework: How to convert strings to numbers while validating JSON

查看:99
本文介绍了Play框架:如何在验证JSON时将字符串转换为数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出以下JSON.

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

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

... 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中),则可以使用transformupdate:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆