我尝试使用Scala到Json在play 2.0应用程序中序列化我的模型.这是我的代码的样子:
package models
import play.api.libs.json._
case class Task(id: Long, label: String, date: String)
object Task {
...
implicit object TaskFormat extends Format[Task] {
def reads(json: JsValue): Task = Task(
(json \ "id").as[Long],
(json \ "label").as[String],
(json \ "date").as[String])
def writes(t: Task): JsValue = JsObject(Seq(
"id" -> JsNumber(t.id),
"label" -> JsString(t.label),
"date" -> JsString(t.date)))
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,运行应用程序时出现以下错误:
verriding method reads in trait Reads of type (json: play.api.libs.json.JsValue)play.api.libs.json.JsResult[models.Task]; method reads has incompatible type
Run Code Online (Sandbox Code Playgroud)
我还没有找到解决方案.api的文档(http://www.playframework.org/documentation/api/2.0/scala/play/api/libs/json/package.html)似乎也暗示了我采取的方法.
有人发现我的错误吗?
非常感谢,
乔尔
我正在使用play 2.1.1,我在迭代数组时遇到问题.我读的地方,你可以创建一个列表[对象]一读,但每次我尝试这样做,我得到一个错误"No unapply function found"的这行
implicit val userListReads: Reads[List[FBUser]] = Json.reads[List[FBUser]]". The issue is " = Json.reads[List[FBUser]]
我无法尝试其他什么.任何帮助将不胜感激.
def linkUsers() = Action { implicit request =>
val json = Json.parse("{\"data\": [{\"name\": \"Me Lazyan\",\"id\": \"1182\"},{\"name\": \"Chales Dselle\",\"id\": \"10115\"},{\"name\": \"Be My\",\"id\": \"10275\"},{\"name\": \"De Rwani\", \"id\": \"11189\"},{\"name\": \"Phoe Johon\", \"id\": \"11372\"}]}")
val peoples = json.validate[List[FBUser]].get
peoples.foreach(println)
Ok(json).withHeaders(CONTENT_TYPE -> "text/json")
}
case class FBUser(
name: String,
id: String
)
object FBUser {
/** Uses a Scala Macro to define the Reads function …Run Code Online (Sandbox Code Playgroud) json scala playframework playframework-2.0 playframework-json
我需要一种表征2D点集大小的方法,以便可以根据视口的比例确定将它们渲染为空间中的单个点还是代表性多边形。我已经有了一种算法来计算集合的凸包以生成代表性多边形,但是我需要一种表征其大小的方法。一个明显的度量是凸包上点之间的最大距离,即集合的直径。但是我真的更感兴趣于垂直于其直径的横截面的大小,以找出边界多边形有多窄。给定顶点和最远点的索引的排序列表(理想情况是在Python中),是否有一种简单的方法来做到这一点?
或者,是否有一种简单的方法来计算一组点的最小面积边界椭圆的半径?我已经看到了解决此问题的一些方法,但是没有什么可以轻易转换为Python的,所以我真的在寻找可以交钥匙的东西。
我正在使用sbt-concat来组合css/js包进行实验.然后我尝试扩展我的管道,以便缩小我的css和js.使用sbt-css-compress相当容易,它可以缩小sbt-concat生成的所有CSS.我为js尝试了sbt-closure,但它似乎不起作用.为了清楚起见,我尝试了sbt-closure,并确认它将以下所有js编译为/ assets.但是,我试图弄清楚它是否适用于sbt-concat.
例如:如果我有/assets/js/f1.js和/assets/js/f2.js并且我想将它们组合并缩小为1个捆绑文件.
鉴于以下Enumeration...
object MyEnum extends Enumeration {
type MyEnum = Value
val Val1 = Value("val1")
val Val2 = Value("val2")
val Val3 = Value("val3")
}
import MyEnum._
Run Code Online (Sandbox Code Playgroud)
...以及以下Map...
val m = Map(
val1 -> "one",
val2 -> "two",
val3 -> "three"
)
Run Code Online (Sandbox Code Playgroud)
...我需要转换m为JSON:
import play.api.libs.json._
val js = Json.toJson(m)
Run Code Online (Sandbox Code Playgroud)
最后一条语句无法编译,因为编译器找不到type的Json序列化器scala.collection.immutable.Map[MyEnum.Value,String]。
问题:由于Play确实提供了type的序列化器scala.collection.immutable.Map[String,String],并且我的枚举实际上包含字符串,是否可以重用默认的JSON序列化器?
有谁知道我们如何以自动方式从任何Seq转换为_*?每次我们有Seq时强制类型并且方法使用类型为vararg的参数非常麻烦.
def mean[T: Numeric](elems: T*): Double
...
elems = Seq(1.0, 2.0, 3.0)
mean(elems) // this doesn't compiles
mean(elems: _*) // this compiles but it is cumbersome
Run Code Online (Sandbox Code Playgroud) 我只是比较如何在java中将对象序列化和反序列化为JSON.
ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{'name' : 'john smith'}";
User user = mapper.readValue(jsonInString, User.class);
Run Code Online (Sandbox Code Playgroud)
使用Playframework和Scala,我必须创建这些读取和写入映射器,它们非常冗长.(参见:https://www.playframework.com/documentation/2.5.x/ScalaJsonHttp)
为什么它不能像java w/Jackson一样"工作"?
我有我的模型,我想简单地读/写然后到JSON.使用Java,我没有任何样板代码可供编写.
是否有最佳实践来表示变量字段,该字段可以是具有子字段的对象,也可以是一个或多个enum类似的单例值?就像,如果只有一个单例值,可以使用可空union(如果有点笨拙,如果该值不感觉"零"),但是不止一个单例呢?
我的域模型有很多enum像这样的结构,其中一些变体不携带任何数据.我希望答案不是制作虚拟字段,以便每个变体都是一个对象类型,以满足要求union.但也许我错过了一些东西.