加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

向Scala对象播放2.1 JSON

发布时间:2020-12-16 09:49:07 所属栏目:安全 来源:网络整理
导读:我有一个 Scala案例类 case class Example(name: String,number: Int) 和一个伴侣 object Example { implicit object ExampleFormat extends Format[Example] { def reads(json: JsValue) = { JsSuccess(Example( (json "name").as[String],(json "numbe
我有一个 Scala案例类

case class Example(name: String,number: Int)

和一个伴侣

object Example {
  implicit object ExampleFormat extends Format[Example] {
    def reads(json: JsValue) = {
      JsSuccess(Example(
       (json  "name").as[String],(json  "number").as[Int]))
     }

     def writes(...){}
   }
}

它将JSON转换为Scala对象.

当JSON有效时(即{“name”:“name”,“number”:0}它工作正常.但是,当数字用引号{“name”:“name”,“number”:“0”} I时得到一个错误:validate.error.expected.jsnumber.

有没有办法在这种情况下隐式地将String转换为Int(假设该数字有效)?

解决方法

借助 orElse助手,您可以使用Json组合器轻松处理此案例.我用Play2.1引入的新语法重写了你的json formater

import play.api.libs.json._
import play.api.libs.functional.syntax._

object Example {
  // Custom reader to handle the "String number" usecase
  implicit val reader = (
    (__  'name).read[String] and
    ((__  'number).read[Int] orElse (__  'number).read[String].map(_.toInt))
  )(Example.apply _)

  // write has no specificity,so you can use Json Macro
  implicit val writer = Json.writes[Example] 
}

object Test extends Controller {
  def index = Action {
    val json1 = Json.obj("name" -> "Julien","number" -> 1000).as[Example]
    val json2 = Json.obj("name" -> "Julien","number" -> "1000").as[Example]
    Ok(json1.number + " = " + json2.number) // 1000 = 1000
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读