Scala, конвертируйте joda.LocalDateTime в json с помощью игры 2.5. - PullRequest
0 голосов
/ 20 сентября 2018

Я новичок в Scala, и мой вопрос о сериализации Json с использованием play (2.5) для необязательного значения Joda Мои входы: 1.

import org.joda.time.LocalDateTime
     case class User(
                     name: String, 
                     lastLogin: Option[LocalDateTime])
    object User {
      implicit val serializers = JsonSerializers
      implicit val UserFormat: Format[User] = Format(serializers.UserReads, serializers.UserWrites)
    }

Сериализаторы

import com.dtos.{User}
import org.joda.time.LocalDateTime
import org.joda.time.format.DateTimeFormat
import play.api.libs.json._
import play.api.libs.functional.syntax._
object JsonSerializers {
  val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"

  implicit val UserReads: Reads[User] = (
    (JsPath \ "name").read [String] and
      (JsPath \ "active").read [Boolean] and
      (JsPath \\ "$ldt").read[LocalDateTime]
    )(User.apply _)

  implicit val UserWrites: Writes[User] = (
    (JsPath \ "name").write [String] and
      (JsPath \ "active").write [Boolean] and
      (JsPath \ "lastLogin" \ "$ldt") .write [LocalDateTime]
    )(unlift (User.unapply))
}

Тестовый объект:

object MainTest extends App {    
  val value: JsValue = Json.parse("{ \"name\" : \"hello\" , \"lastLogin\" : {\"$ldt\":\"2018-09-09T11:06:27.655\"} }")
  println("First Output:")
  println(Json.toJson(new MyUser("user", LocalDateTime.now)))
  println("Second Output:")
  println(Json.fromJson(value))    
}

Вопросы: 1. Как управлять значением параметра во времяUserReads / UserWrites?Я получаю следующую ошибку:

перегруженное значение метода применяется с альтернативами: [B] (f: B => (String, Boolean, org.joda.time.LocalDateTime)) (неявный fu: play.api.libs.functional.ContravariantFunctor [play.api.libs.json.Reads]) play.api.libs.json.Reads [B] [B] (f: (строка, логическое значение, org.joda.time).LocalDateTime) => B) (неявный fu: play.api.libs.functional.Functor [play.api.libs.json.Reads]) play.api.libs.json.Reads [B] не может быть применен к ((String, Boolean, Option [org.joda.time.LocalDateTime]) => com.dtos.User) (JsPath \ "active"). Read [Boolean] и

не может заставить его работать на входе Json Structure of User, когда $ ldt является подэлементом lastLogin:

 val value: JsValue = Json.parse("{ \"name\" : \"hello\" , \"lastLogin\" : {\"$ldt\":\"2018-09-09T11:06:27.655\"} }")

(means User is defined by:
"name\":\"myName\",
\"active\":true,
\"lastLogin\":{\"$ldt\":\"2018-09-09T11:06:27.655\"}
}
)

1 Ответ

0 голосов
/ 21 сентября 2018

Я думаю, что вам не хватает сериализатора Format[LocalDateTime].

Option поддерживается из коробки.

Взято из другого ответа Stackoverflow:

import org.joda.time.LocalDateTime
import org.joda.time.format.ISODateTimeFormat

implicit val readsJodaLocalDateTime = Reads[LocalDateTime](js =>
  js.validate[String].map[LocalDateTime](dtString =>
    LocalDateTime.parse(dtString, ISODateTimeFormat.basicDateTime())
  )
)

Смотрите здесь полный ответ: custom-jodatime-serializer-using-play-frameworks-json-library

Кстати, для классов case вы можете добавить сериализатор следующим образом:

object User {
  implicit val jsonFormat: Format[User] = Json.format[User]
}
...