json - 使用组合器: how to deal with nested optional objects? Play 2.2 JSON读

标签 json scala playframework scala-2.10 playframework-2.2

我疯狂地尝试在Play Framework 2.2中解析此JSON结构:

val jsonStr = """{ personFirstName: "FirstName",
  personLastName: "LastName"
  positionLat: null,
  positionLon: null }"""

我有2个案例类:
case class Position( val lat: Double, val lon: Double)
case class Person( firstName: String, lastName: String, p: Option[Position] )

如您所见,在Person案例类中,Position不是必需的。

我试图使用这样的东西来获得Person的实例
implicit val reader = (
  (__ \ 'personFirstName ).read[String] ~
  (__ \ 'personLastName ).read[String] ~
  ( (__ \ 'positionLat ).read[Double] ~
    (__ \ 'positionLon ).read[Double] )(Position)
)(Person)

但是我很快意识到我不知道如何处理Option[Position]对象:如果要同时指定'lat'和'lon'且不为null,则打算实例化Some(Position(lat,lon)),否则实例化None

您将如何处理?

最佳答案

我敢肯定,比起我要发布的内容,有一种更好的方法来做您想要的事情,但是已经很晚了,我现在无法弄清楚。我假设,简单地更改您正在使用的JSON结构不是这里的选择。

您可以提供一个生成器函数,该函数对纬度/经度取两个可选的 double 值,如果两个都存在,则产生一个头寸。

import play.api.libs.functional.syntax._
import play.api.libs.json._

val jsonStr = """{
  "personFirstName": "FirstName",
  "personLastName": "LastName",
  "positionLat": null,
  "positionLon": null }"""

case class Position(lat: Double, lon: Double)

case class Person( firstName: String, lastName: String, p: Option[Position] )

object Person {
  implicit val reader = (
    (__ \ "personFirstName" ).read[String] and
    (__ \ "personLastName" ).read[String] and (
      (__ \ "positionLat" ).readNullable[Double] and
      (__ \ "positionLon" ).readNullable[Double]
    )((latOpt: Option[Double], lonOpt: Option[Double]) => {
      for { lat <- latOpt ; lon <- lonOpt} yield Position(lat, lon)
    })
  )(Person.apply _)
}

Json.parse(jsonStr).validate[Person] // yields JsSuccess(Person(FirstName,LastName,None),)

另外,请注意,要使用有效的JSON,您需要quote the data keys

关于json - 使用组合器: how to deal with nested optional objects? Play 2.2 JSON读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19479885/

相关文章:

Playframework 与 Typesafe Activator - 主要区别是什么

c# - 如何使用模型属性作为接口(interface)在 ASP.NET Web API 中发布

mysql - 使用 Anorm 确保查询是否执行

scala - 在生产环境中捕获 playframework 中的所有异常和友好的错误页面

scala - 在 Scalatra 示例代码中找到 Scala 中的代字号

java - Jetty 不发起部署 war

json - Play 框架,JSON 读取组合器,具有覆盖的 apply 方法

arrays - 如何从 JSON 数组中提取元素并将其放入另一个数组中

json - 将 JSON 数据作为表格导入到 google 表格中

java - Java中如何从String中获取JSON对象?