2

Option[DateTime]パラメーターを持つケース クラスを、API で提供できるスプレー json オブジェクトに変換したいと考えています。スプレー json を使用して、私はカスタム JsonFormat を持っています。

object JsonImplicits extends DefaultJsonProtocol {
  implicit object PostJsonFormat extends RootJsonFormat[Post] {

    def write(p: Post) = JsObject(
      "title" -> JsString(p.title),
      "content" -> JsString(p.content),
      "author" -> JsString(p.author),
      "creationDate" -> JsString(p.creationDate.getOrElse(DateTime.now))
    )
  }
}

しかし、私は得る:

overloaded method value apply with alternatives:
  (value: String)spray.json.JsString <and>
  (value: Symbol)spray.json.JsString
  cannot be applied to (com.github.nscala_time.time.Imports.DateTime)
    "creationDate" -> JsString(p.creationDate.getOrElse(DateTime.now))

コンパイルしようとすると、何をしようとしても、DateTime オブジェクトを文字列に変換できないようです。たとえば、電話をかけようとするtoStringと、

ambiguous reference to overloaded definition,
  both method toString in class AbstractDateTime of type (x$1: String, x$2: java.util.Locale)String
  and  method toString in class AbstractDateTime of type (x$1: String)String
  match expected type ?
    "creationDate" -> JsString(p.creationDate.getOrElse(DateTime.now.toString)))
4

1 に答える 1

10

ここにはいくつかの問題があります。

まず、AbstractDateTime の toString() メソッドには、1 つまたは複数の引数が必要です。こちらを参照してください。

しかし、私はこの道に反対し、Spray-Json を適切に使用することをお勧めします。

Spray-json は をシリアル化する方法を認識していないOption[DateTime]ため、 を提供する必要がありますRootJsonFormat

これが私がやっていることです。

implicit object DateJsonFormat extends RootJsonFormat[DateTime] {

    private val parserISO : DateTimeFormatter = ISODateTimeFormat.dateTimeNoMillis();

    override def write(obj: DateTime) = JsString(parserISO.print(obj))

    override def read(json: JsValue) : DateTime = json match {
      case JsString(s) => parserISO.parseDateTime(s)
      case _ => throw new DeserializationException("Error info you want here ...")
    }
  }

ISOフォーマットを使用したくない場合は、必要に応じて調整してください。

于 2014-08-07T09:49:28.563 に答える