如果我错了,请纠正我,但是当使用 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 implicits,这是一个非常强大的功能,可用来使该机制高度可插入,在您调用的那一刻:
Json.toJson(Location(4.5, 5.3))
编译器将在范围内寻找与所需类型匹配的隐式。 Scala 语言规范 描述了解析隐式的算法,这种算法的设计方式是您可以在有限范围内“导入”隐式。多亏了这个特性,在你程序的不同部分,你可以让你的 Reads/Writes 或任何类型类的不同实现可见。
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 中,这通常是通过内省(introspection)和反射来完成的。您可能需要使用注释来帮助 Spring 确定如何从您的数据模型构建 Json。结果是您无法更改完成方式,因此灵 active 较低。
由于您可能不需要更多的灵 active ,许多 Scala 库/框架为您提供了生成所需类型类的默认实现的函数。那行额外的代码
implicit val fmt = Json.format[Location]
是你必须付出的代价,因为Play json序列化依赖隐式。
关于java - 为什么在 Java 中不需要创建这些 json 读/写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25432588/