【问题标题】:How write Reads function for Scala Play如何为 Scala Play 编写读取函数
【发布时间】:2019-06-04 09:19:21
【问题描述】:

我有读取问题。我有这样的功能:

  private val myFunc: Reads[Foo] =
    (__ \ "foo")
      .readNullable[Foo]
      .map {
        case Some(foo) => foo
        case None =>
          (__ \ "bar").readNullable[Bar].map {
            case Some(bar) => Foo(bar.value)
            case None => Foo("")
          }
      }

但是我遇到了这样的编译器问题:

[error]  found   : play.api.libs.json.Reads[com.me.Foo]
[error]  required:com.me.Foo

我该如何解决这个问题?

【问题讨论】:

  • BTW Foo("") 让我觉得存在设计问题,Foo 字段必须是 Option[String] 而不是 StringOption.empty[String] vs "" vs null: String )
  • @cchantep no Foo is case Foo(value : String)
  • 您能分享一下您的FooBar 定义吗?
  • 我认为 value 不应该是 String 如果您最终提供一个代表缺失(空)值的 "" ... 对我来说这是一个可选值

标签: scala playframework play-json


【解决方案1】:
import play.api.libs.json._

case class Foo(lorem: String)

implicit val fooReads: Reads[Foo] = Json.reads[Foo]

case class Bar(value: String)

implicit val barReads: Reads[Bar] = Json.reads[Bar]

val reads: Reads[Foo] = (__ \ "foo").read[Foo].orElse {
  (__ \ "bar").readNullable[Bar].map {
    case Some(bar) => Foo(bar.value)
    case None => Foo("")
  }
}

// ---

Json.parse("""{"foo":{"lorem":"ipsum"}}""").validate(reads)
// JsSuccess(Foo(ipsum),/foo)

Json.parse("""{"bar":{"value":"ipsum"}}""").validate(reads)
// JsSuccess(Foo(ipsum),/bar)

因为在orElse 中实例化Bar 没有任何价值:

val reads: Reads[Foo] = (__ \ "foo").read[Foo].orElse {
  (__ \ "bar" \ "value").readNullable[String].map {
    case Some(bar) => Foo(bar)
    case None => Foo("")
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多