如果我错了,请纠正我,但是当使用 Java 和 Spring MVC 时,您不必创建这些额外的类来将 Java 类映射到 JSON 以及将 JSON 映射到类。
为什么必须在 Play with Scala 中执行此操作?和Scala有关系吗?
case class Location(lat: Double, long: Double)
implicit val locationWrites: Writes[Location] = (
(JsPath \ "lat").write[Double] and
(JsPath \ "long").write[Double]
)(unlift(Location.unapply))
implicit val locationReads: Reads[Location] = (
(JsPath \ "lat").read[Double] and
(JsPath \ "long").read[Double]
)(Location.apply _)
您必须在 Play 中执行此操作的原因是框架设计选择,而且是非常好的一个。
在 Play 中,该机制依赖于Scala 隐式,这是一个非常强大的功能,可以使该机制高度可插拔的,在这个意义上,你现在打电话:
Json.toJson(Location(4.5, 5.3))
编译器会寻找一个implicit在与所需类型匹配的范围内。这Scala 语言规范描述了解决隐式问题的算法,这种算法的设计方式使您可以“import“在有限范围内隐式。由于此功能,在程序的不同部分中,您可以使读/写或任何类型类的不同实现可见。
object MyImplicits {
object ImplicitJson1{
implicit val write:Write[Location] = "write to json all fields"
}
object ImplicitJson2{
implicit val write:Write[Location] = "skip field a"
}
}
object MyBusinessCode{
def f1(location:Location){
import MyImplicits.ImplicitJson1._
Json.toJson(location)
}
def f2(location:Location){
import MyImplicits.ImplicitJson2._
Json.toJson(location)
}
def dynamicChoice(location:Location){
implicit val write = {
if(location.isEurope)
MyImplicits.ImplicitJson1.write
else
MyImplicits.ImplicitJson2.write
}
Json.toJson(location)
}
}
相反,在 Spring 中,这通常是通过内省和反思来完成的。您可能需要使用注释来帮助 Spring 确定如何从数据模型构建 Json。结果是您无法改变其完成方式,因此灵活性较差。
由于您可能不需要更大的灵活性,因此许多 Scala 库/框架为您提供了生成所需类型类的默认实现的函数。那额外的一行代码
implicit val fmt = Json.format[Location]
是你必须付出的代价,因为 Play json 序列化依赖于隐式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)