0

Playframework コンテキストで Scala に JSON オブジェクトを構築するコードがいくつかあります。

def toJson(): JsObject = Json.obj(
  "status" -> JsString(result.getOrElse("fail")),
  "age" -> JsNumber(age.getOrElse(0))
)

result と age は Option でラップされます。年齢行の getOrElse 部分は、年齢が利用できないことを示しています。それが私が回避したいことです。

結果の出力は次のとおりです。

{
status: "fail",
age: 0
}

質問 A:この例では、age が None であるため、getOrElse は 0 を返します。これは、クライアントが特別な意味を持つマジック ナンバーとして解釈する必要があります。None のようなものを返したいのですが、play.api.libs.json.JsNumber は scala.BigDecimal を期待しています。

どういうわけかこれを回避する方法はありますか?

質問 B:質問 A の解決策は、年齢が利用できない場合に備えて年齢を除外することです。結果は次のようになります。

{
status: "fail"
}

Json.obj(a, b, ...) コンストラクト内をいじることはできません...

では、このようなことを実現するためのコードはどのようになるでしょうか?

4

1 に答える 1

2

このようなものがうまくいくかどうかを確認してください:

val fields:Seq[Option[(String,JsValueWrapper)]] = Seq(
  result.map(s => ("status", JsString(s))),
  age.map(i => ("age", JsNumber(new BigDecimal(i))))
)
val finalFields = fields.flatten

Json.obj(finalFields:_*)   

Seq がフラット化されると、その中の None 型は削除される必要があるため、結果の一部にはなりませんJsObject

于 2013-10-03T13:16:31.703 に答える