java - 为什么在 Java 中不需要创建这些 json 读/写?

标签 java scala playframework

如果我错了,请纠正我,但是当使用 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/

相关文章:

java - 是否可以监视遇到 OOM 错误的 Java 进程?

Java 字符串特殊字符替换

Scala Play Framework 2.6 将特征格式密封为 Json

java - Play JPA 查询示例

testing - Play Framework 重定向到其他方法在测试中返回 303

java - 安卓 : Get data in real-time instead of using Async-Task

java - 设置 CriteriaBuilder

scala - 如何在 Scala 中向 Map 添加可选条目?

scala - 为什么使用 Kryo 序列化时 Spark 的性能更差?

scala - playframework2 jquery 错误 (jquery.min.map)