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

scala – 播放JSON组合

发布时间:2020-12-16 19:02:15 所属栏目:安全 来源:网络整理
导读:在Play 2.1中,我们使用下面的东西,通过读取从 JSON获取生物对象. implicit val creatureReads = ( (__ "name").read[String] and (__ "isDead").read[Boolean] and (__ "weight").read[Float])(Creature.apply _) 在Scala中是相对新的,我试图明白是否
在Play 2.1中,我们使用下面的东西,通过读取从 JSON获取生物对象.

implicit val creatureReads = (
  (__  "name").read[String] and
  (__  "isDead").read[Boolean] and
  (__  "weight").read[Float]
)(Creature.apply _)

在Scala中是相对新的,我试图明白是否有任何其他方式构建Creature对象而不使用Apply方法?是否有可能有一个匿名的功能来创建对象,而不是依赖于应用?

我使用的情况下,我的对象中的大多数字段可能会丢失,但我仍然希望从我所拥有的内容中构建对象.最好是为对象定义一个READ,并为每个字段使用readnullable?

我也可以有复杂的条件,所以只需定义自定义函数来构建它,而不是试图捕获一个读者中的所有案例,这将是更清洁的?

解决方法

是的,当然,apply方法只是一种方法,可以使用所有的case类参数.这大致翻译成如下:

implicit val creatureReads = (
  (__  "name").read[String] and
  (__  "isDead").read[Boolean] and
  (__  "weight").read[Float]
)((name: String,isDead: Boolean,weight: Float) => new Creature(name,isDead,weight))

对于缺少的字段,您应该使用readNullable并将您的类字段包装到Option中.如果您的可选字段有明确的默认值,则可以使用orElse(Reads.pure(value)).

假设权重是可选的,默认情况下isDead为false:

implicit val creatureReads = (
  (__  "name").read[String] and
  (__  "isDead").read[Boolean].orElse(Reads.pure(false)) and
  (__  "weight").readNullable[Float]
)(Creature.apply _)

有时你甚至不想从JSON中读取一些东西.在这种情况下,一种可能性是明确地传递该值:

def creatureReads(createdAt: DateTime) = (
  (__  "name").read[String] and
  (__  "isDead").read[Boolean].orElse(Reads.pure(false)) and
  (__  "weight").readNullable[Float] and
  (__  "createdAt").read(createdAt)
)(Creature.apply _)

(编辑:李大同)

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

    推荐文章
      热点阅读