自定义Json使用组合器写入 - 不需要案例类的所有字段

  发布于 2023-02-12 19:23

我正在尝试为一个案例类编写一个自定义的Json序列化程序,但我不希望它序列化该类的所有字段.我对Scala很新,所以这肯定是问题,但这是我到目前为止所尝试的:

case class Foo(a: String, b: Int, c: Double)

现在,这样做的默认方式,就我在示例中看到的是:

implicit val fooWrites: Writes[Foo] = (
  (__ \ "a").write[String] and
  (__ \ "b").write[Int]
  (__ \ "c").write[Double]
) (unlift(Foo.unapply))

但是如果我想从Json输出中省略"c"怎么办?到目前为止我已经尝试过这个但是它没有编译:

implicit val fooWritesAlt: Writes[Foo] = (
  (__ \ "a").write[String] and
  (__ \ "b").write[Int]
) (unlift({(f: Foo) => Some((f.a, f.b))}))

任何帮助是极大的赞赏!

3 个回答
  • 我通常做的是将字段转换为None并在其上使用writeNullable:

    implicit val fooWrites: Writes[Foo] = (
      (__ \ "a").write[String] and
      (__ \ "b").write[Int]
      (__ \ "c").writeNullable[Double].contramap((_: Double) => None)
    ) (unlift(Foo.unapply))
    

    2023-02-12 19:25 回答
  • 可以直接构造OWrites,而不是指定生成OWrites实例的组合器:

    val ignore = OWrites[Any](_ => Json.obj())
    
    implicit val fooWrites: Writes[Foo] = (
      (__ \ "a").write[String] and
      (__ \ "b").write[Int] and
      ignore
    ) (unlift(Foo.unapply))
    

    这将忽略该位置的case类的任何值,并且只是总是返回一个空的JSON对象.

    2023-02-12 19:25 回答
  • 如果你正在使用Playframework 2.2(不确定早期版本,但它应该也可以),试试这个:

    implicit val writer = new Writes[Foo] {
      def writes(foo: Foo): JsValue = {
        Json.obj("a" -> foo.a,
                 "b" -> foo.b)
      }
    }
    

    2023-02-12 19:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有