处理一个奇怪的API,它将startDate和startTime作为单独的字段返回,我更喜欢在我的case类中使用一个Joda DateTime字段。我最终无法做到这一点,但想问更大的团队是否有可能。似乎'和'应该在两个字段中读取字符串并且我知道时区我认为可以将它们组合成单个字符串并创建DateTime的实例但是我无法在适当的读取中表达它。
我正在搞乱这些测试对象/ JSON:
import org.joda.time.{ DateTime}
import play.api.libs.functional.syntax._
import play.api.libs.json.Reads._
import play.api.libs.json._
case class Example(startDate:String,startTime:String,name:String)
case class Desired(date:DateTime,name:String)
val json =Json.parse(
"""
|{
|"startDate": "2014-12-31",
|"startTime": "12:43",
|"name":"roger"
|}
| """.stripMargin)
我觉得这是在正确的轨道上,但不确定:
val singleDateBuilder = (JsPath \ "startDate").read[String] and (JsPath \ "startTime").read[String]
但后来我不知道下一步该做什么。
得到了这个,但这可以改进,还是应该以不同的方式完成?
val rawsm =
"""
|{
| "date": "2015-03-24",
| "time": "12:00:00"
|}
""".stripMargin
val reader = (
(__ \ "date").json.pick and
(__ \ "time").json.pick
).tupled.map(t => new DateTime(t._1.as[String] + "T" + t._2.as[String],DateTimeZone.UTC))
val single = Json.parse(rawsm).as[DateTime](reader)
答案 0 :(得分:2)
将读取与and
组合在一起后,您可以提供一个函数,以便从单个读取结果中生成所需的值。例如:
val singleDateBuilder: Reads[DateTime] =
((JsPath \ "startDate").read[String] and
(JsPath \ "startTime").read[String])(
(date: String, time: String) =>
new DateTime(date + "T" + time, DateTimeZone.UTC))