17

リクエストにオプションのフィールドがあります。

case class SearchRequest(url: String, nextAt: Option[Date])

私のプロトコルは次のとおりです。

object SearchRequestJsonProtocol extends DefaultJsonProtocol {
    implicit val searchRequestFormat = jsonFormat(SearchRequest, "url", "nextAt")
}

次の JSON オブジェクトが正しく読み取られ、受け入れられるように、nextAt フィールドをオプションとしてマークするにはどうすればよいですか。

{"url":"..."}
{"url":"...", "nextAt":null}
{"url":"...", "nextAt":"2012-05-30T15:23Z"}

私は実際にはnullの場合はあまり気にしませんが、詳細があればいいと思います. 私はスプレー json を使用していますが、オプションを使用すると、元の JSON オブジェクトにフィールドがない場合、フィールドがスキップされるという印象を受けました。

4

6 に答える 6

11

明示的なフォーマットを作成する必要があるかもしれません (警告: 疑似コディッシュ):

object SearchRequestJsonProtocol extends DefaultJsonProtocol {
    implicit object SearchRequestJsonFormat extends JsonFormat[SearchRequest] {
        def read(value: JsValue) = value match {
            case JsObject(List(
                    JsField("url", JsString(url)),
                    JsField("nextAt", JsString(nextAt)))) =>
                SearchRequest(url, Some(new Instant(nextAt)))

            case JsObject(List(JsField("url", JsString(url)))) =>
                SearchRequest(url, None)

            case _ =>
                throw new DeserializationException("SearchRequest expected")
        }

        def write(obj: SearchRequest) = obj.nextAt match {
            case Some(nextAt) => 
                JsObject(JsField("url", JsString(obj.url)),
                         JsField("nextAt", JsString(nextAt.toString)))
            case None => JsObject(JsField("url", JsString(obj.url)))
        }
    }
}
于 2012-05-30T16:22:52.780 に答える
6

特性を使用してs の NullOptionsスキップを無効にします: https://github.com/spray/spray-json#nulloptions 例: https://github.com/spray/spray-json/blob/master/src/test/scala/spray/ json/ProductFormatsSpec.scalanull

于 2014-04-22T15:44:32.540 に答える
0

これが役立つかどうかはわかりませんが、ケースクラス定義でそのフィールドにデフォルト値を与えることができるため、フィールドがjsonにない場合、デフォルト値が割り当てられます。

于 2014-04-23T11:30:50.190 に答える