使用组合器播放2.2 JSON读取:如何处理嵌套的可选对象?

我在疯狂尝试解析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)),否则实例化无.

你会怎么处理?

解决方法

我很确定有一种更好的方式来做你想做的事情而不是我要发布的内容,但它已经很晚了,我现在无法理解.我假设只是改变您正在使用的JSON结构不是一个选项.

你可以提供一个构建器函数,它为lat / lon提供两个可选的双精度数,并且如果它们都存在则产生一个位置.

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,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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)