为什么你需要创建这些 json 读/写,而在 java 中你不需要创建这些 json 读/写?

2024-06-20

如果我错了,请纠正我,但是当使用 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(使用前将#替换为@)

为什么你需要创建这些 json 读/写,而在 java 中你不需要创建这些 json 读/写? 的相关文章

随机推荐

  • 如何使用 virtualenv 部署具有依赖项的 python webapp?

    我正在寻找一种将用 Python 编写的 Web 应用程序自动部署到服务器的方法 我想用虚拟环境为该应用程序提供一个干净的环境 然而 我想知道部署到服务器时如何管理依赖关系 在开发过程中 我有一个虚拟环境我在其中使用安装外部库pip 所以我
  • 当 Mission Control 启动时,如何隐藏我的 Electron 应用程序窗口?

    我正在构建一个 Electron 应用程序 但我不希望我的应用程序出现在 macOS Mission Control 中 有没有办法在任务控制启动时隐藏窗口 我能够通过使用来实现此行为setAlwaysOnTop窗口对象上的方法 windo
  • python 中带有 lambda 函数字典的奇怪行为

    我编写了一个用于生成 lambda 常量函数字典的函数 它是一个更复杂函数的一部分 但我已将其简化为下面的代码 def function a interpolators for key in a keys interpolators key
  • 将可移植类库(DLL 形式)添加到 Xamarin Studio

    我已经使用 Visual Studio 2012 构建了一个可移植类库 该库也将在 Xamarin Studio 中构建 我想将从该 PCL 从解决方案的 bin 目录 构建的 DLL 添加到 Xamarin Studio 5 3 中的现有
  • type_info 的 std::is_convertible

    在 C 11 中 可以通过以下方式确定类型 A 的变量是否可以隐式转换为类型 B using std is convertible
  • 获取微过滤器驱动程序中的文件路径

    我使用了下面的代码 但它给了我文件路径的结果 status FltGetFileNameInformation Data FLT FILE NAME OPENED FLT FILE NAME QUERY ALWAYS ALLOW CACHE
  • Flexbox 不适用于 iPad 和 Safari [重复]

    这个问题在这里已经有答案了 我在网站上使用 Flexbox 但它在 iPad Air iPad 3 和 Safari PC 上崩溃 设计和代码与此 codepen 类似 http codepen io anon pen xwJzEg htt
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • 如何清除浏览器的缓存?

    当我在 Facebook 上玩应用程序且游戏未加载时 会出现提示 要求清除浏览器缓存 如何清除浏览器的缓存 似乎还没有人提到这一点 所以我想我应该插话一下 当你在 Chrome 中打开页面检查器时 你可以右键单击重新加载页面图标将与菜单一起
  • JQuery hide() 和 fadeOut() 、 show() 和 fadeIn() 之间的区别

    我是 jQuery 新手 目前 我正在我的跨平台移动应用程序之一中使用 jQuery 我需要根据各自的条件隐藏和显示我的一些页面内容 我发现以下两种方法对我来说效果很好 myControlId fadeOut myControlId hid
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • 检测 Angular 项目中的浏览器刷新

    我想使用我的路由器来检测页面何时刷新单页应用程序 https en wikipedia org wiki Single page application 角度项目 还有其他方法吗 In the 组件 ts file import Subsc
  • ESLint 关闭分号规则

    当我搜索关闭分号时 我得到 semi 0或类似的 我尝试将其放入 但我的 linter 仍然在行上添加了分号 下面是我的 eslintrc 我很困惑哪条规则放置了分号 parserOptions ecmaVersion 8 ecmaFeat
  • 允许在 conda env 中使用系统 python?

    有没有办法强制 conda 在给定环境中使用 python 的系统版本 以及所有系统库 我在 shell 中默认启用了 conda 这可能会有点烦人 因为如果我尝试运行系统 python 应用程序 它会获得与预期不同的 python 版本
  • R:表格格式

    我有一个包含以下列的 Excel 文件 Column1 Column2 Column3 ab bb 0 5 ab bc 0 1 ab cd 0 7 ab dd 0 8 ac bb 0 2 ac bg 0 8 ac ee 0 8 ac dd
  • 结构中的内存布局差异

    我在 C 中有以下结构 struct A int a double b float c 该结构与添加了函数的结构之间的内存布局是否存在差异 struct B int a double b float c void foo B foo do
  • ios7 故事板项目不会移动

    我试图在我的视图控制器布局中移动故事板项目 但是当在模拟器中运行时 它们不会移动 它们似乎粘在我放置它们的上方的橙色虚线上 那些橙色线是什么 为什么我无法移动我的物品 Here s what it looks like in the sim
  • 使用不同的结构体定义来模拟 C 中的公共和私有字段

    我已经编写 C 语言相当长的时间了 并且显然知道 C 不支持结构中显式的私有和公共字段 然而 我 相信 我已经找到了一种相对干净的方法来实现这一点 而无需使用任何宏或巫术 并且我希望更深入地了解我可能忽略的可能问题 文件夹结构在这里并不是那
  • 您总是在发布后重定向吗?如果是,您如何管理?

    假设您正在提交一个表单 这会影响您的数据库 添加记录 删除记录 更新记录 您的请求如下所示 POST 应用程序 操作 更新 现在 假设您已完成更新 因此您希望将用户带到主页 Response sendRedirect application
  • 为什么你需要创建这些 json 读/写,而在 java 中你不需要创建这些 json 读/写?

    如果我错了 请纠正我 但是当使用 Java 和 Spring MVC 时 您不必创建这些额外的类来将 Java 类映射到 JSON 以及将 JSON 映射到类 为什么必须在 Play with Scala 中执行此操作 和Scala有关系吗