从多个 JSON 字段创建单个字段
Create single field from multiple JSON fields
处理一个奇怪的 API returns startDate 和 startTime 作为单独的字段,我更愿意在我的案例中使用单个 Joda DateTime 字段 class。我最终无法做到这一点,但想问问更大的群体是否可能。似乎 'and' 应该可以在两个字段中读取字符串,并且考虑到我知道时区,我认为可以将它们组合成单个字符串并创建 DateTime 实例,但我无法在适当的读取中表达它。
我在搞这些测试 objects/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)
将读取与 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))
处理一个奇怪的 API returns startDate 和 startTime 作为单独的字段,我更愿意在我的案例中使用单个 Joda DateTime 字段 class。我最终无法做到这一点,但想问问更大的群体是否可能。似乎 'and' 应该可以在两个字段中读取字符串,并且考虑到我知道时区,我认为可以将它们组合成单个字符串并创建 DateTime 实例,但我无法在适当的读取中表达它。
我在搞这些测试 objects/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)
将读取与 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))