Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala play 2.1.1 json函数语法将数据映射为不同格式_Json_Scala_Playframework_Functional Programming_Playframework 2.1 - Fatal编程技术网

scala play 2.1.1 json函数语法将数据映射为不同格式

scala play 2.1.1 json函数语法将数据映射为不同格式,json,scala,playframework,functional-programming,playframework-2.1,Json,Scala,Playframework,Functional Programming,Playframework 2.1,我正在尝试使用函数语法编写一个自定义json序列化程序,但似乎找不到解决这个特定问题的正确方法。我有几个joda DateTime对象,我想用特定的格式为使用它的UI编写它们。谁能告诉我哪里出了问题 这是我目前正在处理的案例类,没有什么特别的事情发生 case class Banner( id: Int = 0, ownerId: Int = 0, licenseeId: Option[Int] = None, statusColor: Option[String] = None

我正在尝试使用函数语法编写一个自定义json序列化程序,但似乎找不到解决这个特定问题的正确方法。我有几个joda DateTime对象,我想用特定的格式为使用它的UI编写它们。谁能告诉我哪里出了问题

这是我目前正在处理的案例类,没有什么特别的事情发生

case class Banner(
  id: Int = 0,
  ownerId: Int = 0,
  licenseeId: Option[Int] = None,
  statusColor: Option[String] = None,
  content: Option[String] = None,
  displayStart: DateTime = new DateTime(),
  displayEnd: DateTime = new DateTime(),
  created: DateTime = new DateTime(),
  updated: DateTime = new DateTime()
)
这些是我对序列化程序对象的导入

import play.api.libs.json._
import play.api.libs.functional.syntax._
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
首先,joda DateTime隐式地转换为long just fine,这样宏扩展器就可以很好地工作了,如果这就是我想要的

object MySerializers {
  implicit val writesBanner = Json.writes[Banner]
}
我需要的是将displayStart和displayEnd对象转换为特定的字符串格式,而不是长值。这就是我试图做的

object MySerializers {
  val userDateFormatter = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm a")

  implicit val writesBanner = (
    (__ \ "id").write[Int] and
    (__ \ "ownerId").write[Int] and
    (__ \ "licenseeId").write[Int] and
    (__ \ "statusColor").writeNullable[String] and
    (__ \ "content").writeNullable[String] and
    (__ \ "displayStart").write[DateTime].inmap[String](dt => userDateFormatter.print(dt)) and
    (__ \ "displayEnd").write[DateTime].inmap[String](dt => userDateFormatter.print(dt)) and
    (__ \ "created").write[DateTime] and
    (__ \ "updated").write[DateTime]
  )(unlift(Banner.unapply))
}
但是编译器对此并不满意,所以我似乎不理解使用inmap函数的正确方法

could not find implicit value for parameter fu: 
play.api.libs.functional.InvariantFunctor[play.api.libs.json.OWrites]
[error]     (__ \ "displayStart").write[DateTime].inmap[String](dt =>     
userDateFormatter.print(dt)) and
[error]                                ^

非常感谢任何建议。

我设法弄明白了这一点,我使用了错误类型的函子映射操作,并且使用了向后处理的类型。下面是使用更好的函数语法的工作读/写实现

implicit val writesBanner = (
    (__ \ "id").write[Int] and
    (__ \ "ownerId").write[Int] and
    (__ \ "licenseeId").writeNullable[Int] and
    (__ \ "statusColor").writeNullable[String] and
    (__ \ "content").writeNullable[String] and
    (__ \ "displayStart").write[String].contramap[DateTime](dt => userDateFormatter.print(dt)) and
    (__ \ "displayEnd").write[String].contramap[DateTime](dt => userDateFormatter.print(dt)) and
    (__ \ "created").write[DateTime] and
    (__ \ "updated").write[DateTime]
  )(unlift(Banner.unapply))

implicit val readsBanner = (
    (__ \ "id").read[Int] and
    (__ \ "ownerId").read[Int] and
    (__ \ "licenseeId").readNullable[Int] and
    (__ \ "statusColor").readNullable[String] and
    (__ \ "content").readNullable[String] and
    (__ \ "displayStart").read[String].fmap[DateTime](dt => DateTime.parse(dt, userDateFormatter)) and
    (__ \ "displayEnd").read[String].fmap[DateTime](dt => DateTime.parse(dt, userDateFormatter)) and
    (__ \ "created").read[DateTime] and
    (__ \ "updated").read[DateTime]
  )(Banner)

我绝对不是这方面的专家,但我很确定你使用inmap的方式是你如何使用contramap/fmap的组合

即:

implicit val formatBanner = (
<truncated>
    (__ \ "displayStart").format[String].inmap(DateTime.parse(_, userDateFormatter), userDateFormatter.print(_)) and
<truncated>
  )(Banner.apply, unlift(Banner.unapply))
implicit val formatBanner=(
(uu \“displayStart”).format[String].inmap(DateTime.parse(uuu,userDateFormatter)、userDateFormatter.print(uu))和
)(Banner.apply,unlift(Banner.unapply))