使用scala Play框架处理多维JSON

使用scala Play框架处理多维JSON,json,scala,playframework,playframework-2.0,Json,Scala,Playframework,Playframework 2.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

我试图使用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}
 ]
] 
List(
 List(0,0,1),
 List(0,2,0),
 List(0,1,2)
)
在服务器端,我希望使用Play 2 framework将数据转换为Scala 2D列表,如下所示:

[
 [
  {"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}
 ]
] 
List(
 List(0,0,1),
 List(0,2,0),
 List(0,1,2)
)
这是3x3,但可以是50x50左右的变量

感谢您的帮助。

这可能不完整(不知道您是否也想对方形矩阵控件进行建模),但类似的内容可能是一个好的开始:

首先,这里是控制器(和模型)部分可以定义的内容

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
类型进行了别名以保存一些键入

如您所见,读卡器是通过(使用
组合器)组合三个基本块“手工”创建的,并且使用
tuple
操作符将结果展平

使用此解决方案,您现在可以使用这些元组了,但在我看来,代码的可读性很差,因为在此过程中使用了
\u1
\u2
\u3

因此,这里有一种不同的方法(事实上更容易…)来解决理智编码的问题,它将简单地定义一个“case”类,对原子数据进行建模

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))
  }
}
请注意,由于在编译时使用了读取器的隐式创建,读取器将始终跟踪数据表示形式的进一步更改,即
案例类的字段


现在,您将能够使用
x
y
player
字段,而不是
\u1
\u2
\u3

到目前为止您到底尝试了什么,问题出在哪里?从中,我可以找出如何处理具有已知值的简单json。但这可能是数组50*50或3*3。非常感谢。。。第二个解决方案很好。