【问题标题】:Create single field from multiple JSON fields从多个 JSON 字段创建单个字段
【发布时间】:2015-03-25 02:27:29
【问题描述】:

处理一个奇怪的 API,它将 startDate 和 startTime 作为单独的字段返回,我更愿意在我的案例类中使用单个 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)

【问题讨论】:

    标签: json scala playframework-2.0


    【解决方案1】:

    将读取与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))
    

    【讨论】:

    • +1。还值得记住的是,Reads 是一元的,所以你也可以写像for { d <- (__ \ 'date).read[String]; t <- (__ \ 'time).read[String] } yield new DateTime(s"${d}T$t", DateTimeZone.UTC) 这样的东西。
    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2022-10-04
    • 2012-11-22
    • 2023-03-21
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多