0

JSON リクエストを使用して、クライアントからサーバーにデータを送信しようとしています。JSON リクエストの本文は次のようになります。

[
 [
  {"x":"0","y":"0","player":0},
  {"x":"0","y":"1","player":0},                      
  {"x":"0","y":"2","player":1}
 ],
 [
  {"x":"1","y":"0","player":0},
  {"x":"1","y":"1","player":2},
  {"x":"1","y":"2","player":0}
 ],
 [
  {"x":"2","y":"0","player":0},
  {"x":"2","y":"1","player":1},
  {"x":"2","y":"2","player":2}
 ]
] 

サーバー側では、次のように Play 2 フレームワークを使用してデータを Scala 2D リストに変換したいと考えています。

List(
 List(0,0,1),
 List(0,2,0),
 List(0,1,2)
)

これは 3x3 ですが、50x50 などのように可変にすることができます。

助けてくれてありがとう。

4

1 に答える 1

1

不完全かもしれません (正方行列の制約もモデル化するかどうかはわかりません) が、そのようなものは良い出発点になる可能性があります:

最初に、コントローラー (およびモデル) 部分が定義できるものを次に示します。

import play.api.libs.json.Json._
import play.api.libs.json._

type PlayerT = (String, String, Int)

implicit val playerTripleReads:Reads[PlayerT] = (
  (__ \ "x").read[String] and
  (__ \ "y").read[String] and
  (__ \ "player").read[Int]
  tupled
)

def getJson = Action(parse.json) { request =>
  request.body.validate[List[List[PlayerT]]].map{
    case xs => Ok(xs.mkString("\n"))
  }.recoverTotal{
    e => BadRequest("Detected error:"+ JsError.toFlatJson(e))
  }
}

このバージョンでは、いくつかの入力を節約するため(String, String, Int)に型でエイリアス化された形式の検証済みタプルを保持するリストのリストを取得します。PlayerT

ご覧のとおり、リーダーは (andコンビネータを使用して) 3 つの基本ブロックを構成することによって「手動で」作成され、結果はtupled演算子を使用してフラット化されます。

_1このソリューションを使用すると、これらのタプルを使用できるようになりましたが、IMO の使用により、コードの可読性が低下し_2ます_3

したがって、ここに別のアプローチがあります (実際にはもっと簡単です...) 健全なコーディングの問題に取り組みます。これは、アトミック データをモデル化するケース クラスを定義するだけです。

case class Player(x:String, y:String, player:Int)

implicit val playerReads = Json.reads[Player]

def getJson = Action(parse.json) { request =>
  request.body.validate[List[List[Player]]].map{
    case xs => Ok(xs.mkString("\n"))
  }.recoverTotal{
    e => BadRequest("Detected error:"+ JsError.toFlatJson(e))
  }
}

case classリーダーは、コンパイル時にリーダーの暗黙的な作成を使用するため、データ表現のさらなる変更、つまり のフィールドに常に追従することに注意してください。

これで、 、およびではなくxyおよびフィールドを使用できるようになります。player_1_2_3

于 2013-04-14T13:52:32.610 に答える