【问题标题】:How to read/write trait with case objects using play-json如何使用 play-json 读取/写入 case 对象的 trait
【发布时间】:2020-01-14 10:16:12
【问题描述】:

我有以下结构:

  sealed trait Animal {
    def name: String
    def kind: String
  }

  case object Dog extends Animal {
    override def name: String = "A"
    override def kind: String = "B"
  }

  case object Whale extends Animal {
    override def name: String = "C"
    override def kind: String = "B"
  }

如何使用play-json 将其读入/从 json 读取/写入? writes 很简单,但 reads 呢?

【问题讨论】:

    标签: scala playframework play-json


    【解决方案1】:

    如果你想坚持使用案例对象,你可以定义一个自定义的Writer /Reader

    import play.api.libs.json._
    implicit val w: Writes[Animal] = {
      case d @ _ => Json.obj(
        "name" -> d.name,
        "kind" -> d.kind
      )
    }
    Json.toJson(Dog)
    

    您可以自定义它以单独处理每个对象,以便您可以处理在案例对象中引入新字段的情况。

    【讨论】:

    • 即使使用object,也不需要具有最新 Play-JSON 版本的自定义处理程序
    【解决方案2】:

    你需要case classes而不是case objects,比如:

    sealed trait Animal {
        def name: String
        def kind: String
      }
    
      case class Dog(name: String = "A", kind: String = "B") extends Animal 
    
      case class Whale(name: String = "C", kind: String = "B") extends Animal
    

    或者,如果您有静态值,我们可以使用来自 enumeratum 的枚举

    【讨论】:

    • 好的,但是我可以保护类免受非默认值的影响吗?
    • 这样的object 有什么意义?除了一些有限的测试?
    • @zella 我认为枚举是更好的方法 - 请参阅我的链接。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2013-04-07
    • 2017-08-23
    • 2021-08-12
    • 2011-05-23
    • 2019-01-20
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多