创建通用 Json 序列化函数

2024-04-25

是否可以使用 Play Framework 2.2 在 Scala 中创建一个通用函数,将任意对象序列化为 JSON,而无需提供编写器或格式化程序?

例如,此非通用代码将创建给定客户的 JSON 响应:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Customer(id: Int, name: String)

object scratch {
  val p = Customer(1, "n")                        
  //> p  : Customer = Customer(1,n)

  def createJsonResponseCustomer(data: Customer) = {
    implicit val formatter = Json.format[Customer]
    Json.obj("success" -> true, "data" -> Json.toJson[Customer](data))
  }

  createJsonResponseCustomer(p)                   
  //> res0: play.api.libs.json.JsObject = {"success":true,"data":{"id":1,"name":"n"}}
}

为了避免为每个不同的对象定义格式化程序,我想创建一个像这样的通用函数:

def createJsonResponse[T](data: T) = {
  implicit val formatter = Json.format[T]
  Json.obj("success" -> true, "data" -> Json.toJson[T](data))
}

但这种尝试会产生错误No unapply function found at Json.format[T].

换句话说,这有效:

def getFormatter(c: Customer) = Json.format[Customer]

但这并没有:

def getFormatterGeneric[T](c: T) = Json.format[T]

有没有办法解决?


您需要在某处为您希望读取或写入的每种类型定义格式化程序。这是因为格式化程序实例是在编译时解析的,而不是在运行时解析的。这是一件好事,因为这意味着尝试序列化没有序列化器的类型会成为编译时错误,而不是运行时错误。

不要动态定义格式化程序,而是在可以重用的模块中定义它们,例如

object JsonFormatters {
  implicit val customerWrites: Format[Customer] = Json.format[Customer]
}

Then import JsonFormatters._在您想要编写一些 JSON 的范围内。

现在,您可以编写与您想要的类似的通用方法:您只需在方法的签名中指定格式化程序的要求即可。实际上,这是类型的隐式参数Writes[T].

def createJsonResponse[T](data: T)(implicit writes: Writes[T]) =
  Json.obj("success" -> true, "data" -> Json.toJson[T](data))

您还可以使用上下文绑定语法编写此方法签名,即

def createJsonResponse[T : Writes](data: T) = ...

这需要有一个实例Writes[T]在适用范围;但编译器会根据类型为您选择正确的实例T,而不是你明确地解决它。

注意Writes[T]是一个超类型Format[T];因为你只是writing此方法中的 JSON,无需指定Format[T],这也会给你Reads[T].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建通用 Json 序列化函数 的相关文章

  • 在 JSON 对象中存储和发送原始文件数据

    我正在寻找一种方法来传输任何文件类型的原始文件数据和任何可能的内容 我的意思是文件和文件内容都是用户生成的 在 Backbone 前端中使用 xhr ajax 调用两种方式针对 Django 后端 编辑 也许问题仍然不清楚 如果您在 IDE
  • Struts2 中有多种结果类型?

    我有一个使用 Tiles 的 Struts2 应用程序 如何在操作映射中获取多种结果类型 因为我需要将de输出设置为JSON数据 并且同时Tiles 我努力了
  • 如何通过填充 NSDictionary 以 JSON 格式发送 UIImage

    我正在尝试使用 JSON 将数据发送到服务器 我可以使用我的对象和关键参数创建 NSDictionary 但我想发送我的图片 图片是UIImage NSDictionary mainJSON NSDictionary dictionaryW
  • 使用 Scala 进行网页抓取 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • 在 PlayFramework 2 / Ebean ORM 中使用 @OneToOne,其中子级和父级共享相同的主键

    有两种型号 模型 User java Entity Table name users public class User extends Model Id public int user id public String firstName
  • 带有 Play 框架的 cassandra

    我正在尝试开发一个由两部分组成的应用程序 Web 服务和 Android 应用程序 我计划使用 java play 框架和 cassandra noSQL 数据库来实现我的 Web 服务 我已经找了两天了 我还是不知道该怎么做 我需要集成一
  • Scala 交互式解释器 (REPL) - 如何将输出重定向到文本文件?

    是否可能 如果可能 是如何做到的 通常 gt and gt gt 在 Windows 或 Linux 命令行上工作的命令在这种情况下不起作用 您可以从控制台以编程方式执行此操作 import java io FileOutputStream
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • Shapeless 和 gremlin scala:如何返回调用 `as` 的结果?

    所以 我调用这个函数as from gremlin scala case class GremlinScala End Labels lt HList traversal GraphTraversal End def as name Str
  • 在 Django 模板中通过键访问字典

    我正在将字典从我的视图传递到模板 所以 key1 value1 key2 value2 传入并循环键 值对很好 但是我还没有找到从特定键直接在视图中访问的优雅解决方案 例如 key1 例如 bu json items key1 我可以使用一
  • dart中解析对象(不支持的操作:无法添加到固定长度列表)

    我有一个用户对象 当用户登录 注册时 该对象保存到云 Firestore 数据库中 因此 当用户登录时 将从数据库中检索用户对象 并且一切正常 直到我尝试对列表 usersProject 执行 添加 操作 Add the new proje
  • 将MongoDb atlas数据库导出到本机Mongo compass

    我在 Atlas 中有一个名为 test 的远程数据库 我想将集合名称 image table 下载为 JSON 文件 在 Mac 终端中 mongoexport db test collection image table image j
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • C# 抽象泛型方法

    C net 3 5 我正在尝试创建一个具有通用方法的基类 从它继承的类应该指定方法的类型 这样做的前提是创建管理过滤的类 所以我有 public abstract class FilterBase NEED Help Declaring t
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 将字符串转换为枚举值的 Scala 安全方法

    假设我有枚举 object WeekDay extends Enumeration type WeekDay Value val Mon Tue Wed Thu Fri Sat Sun Value 我希望能够将 String 转换为 Wee
  • META-INF/服务应该在 sbt 中的哪里

    META INF 目录应该放在哪里 以便 sbt 获取自定义配置 我在尝试使用 ServiceLoader 时遇到了这个问题 并且我试图在 META INF services 中创建自定义服务 如果您将 META INF 文件夹放在 src
  • java.lang.OutOfMemoryError:Scala 上超出了 GC 开销限制

    我是 Scala 开发人员 我在Routes它包含的文件1008行如果我添加另一行 则会抛出下面的错误 Uncaught error from thread sbt web scheduler 1 shutting down JVM sin

随机推荐

  • 离子范围滑块 2.0.3

    我正在尝试使用离子范围滑块 2 0 3 URL http ionden com a plugins ion rangeSlider demo advanced html http ionden com a plugins ion range
  • 类型错误:无法读取未定义的属性(读取“html”)

    我正在尝试将 Jest 引入我当前的项目 然而 在初始设置过程中 我遇到了这个错误 并且无法正常运行 我该如何解决这个问题 我目前正在使用 vue cli 中的 vue2 Test suite failed to run TypeError
  • 使用 Excel 连接函数

    我正在尝试将 Excel 中三列的数据合并到一列中 例如 我想将 Product Location 和 Key id 合并到一列中 Product Location Key Id Car VA 86421910 Car VA 8642448
  • 在 header("Location: ") 调用后是否调用 exit 有关系吗?

    我似乎无法找到答案 直到我发现这个帖子 http www php net manual en function exit php 90713 on exit在 php net 上 发送 Location 标头 PHP 后will继续解析 h
  • Matlab:不正确的索引矩阵参考(或智胜matlab)

    我希望能够写jasmine http pivotal github io jasmine 类似于 Matlab 中的测试 所以像 expect myfibonacci 0 toBe 0 expect myfibonacci 5 toBe 1
  • C# 与 C++ 中的运算符 new

    来自 C 我对使用newC 中的关键字 我知道它不像 C 那样工作new从某种意义上说 您不必手动控制对象的生命周期 因为 C 具有垃圾收集功能 然而 当阅读其他人的 C 代码时 我注意到代码片段 1 中的语句 避免使用new总而言之 就像
  • 如何在模拟器android studio中设置密度

    我想创建一个 Samsung Galaxy XCover4S 720 x 1280 px 5 00 294ppi 64 6 屏幕与机身比例 的模拟器 但是我只找到了如何设置预定义的密度 如 120 240 320 和更多密度 ppi in
  • 如何识别托管 bean 中单击的 commandButton

    我有一个actionListener我的托管 bean 中的方法由许多命令按钮调用 public void verifyTestDisponibility ActionEvent actionEvent if button1 clicked
  • SQL 作为访问表单字段的控制源

    有什么方法可以使用 SQL 填充 Access Form 的文本字段值吗 我读到不可能简单地输入 SQL 作为控制源 这是真的 谢谢你的帮助 edit 我需要执行这个查询 SELECT tblCaseIssues IssueDesc FRO
  • Chartjs 插件数据标签不在图表上显示值

    我正在尝试使用 Chartjs 数据标签插件获取每个条形上的值 因此 在 a 条上方 a 想要看到数字 30 在 b 条上方或内部我想看到数字 50 但它根本没有显示任何价值 谁能帮忙并告诉我出了什么问题吗 我也尝试过使用不同版本的char
  • 让隐藏的div出现然后消失?

    让 div 出现然后淡出几秒钟的最简单方法是什么 fade div visibility none position fixed background color yellow border 1px solid black top 300p
  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi
  • 如何在describe()的before()块中动态生成Mocha测试?

    我正在创建一个 mocha 测试套件 该套件正在测试我们的 nwjs 应用程序正在调用的命令行实用程序 该实用程序获取文件并生成输出 json 文件 我有数千种输入文件组合和我想要生成的测试 it s 具体取决于 cmdline 实用程序的
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • CSS 中具有透明背景的锯齿状边缘

    使 div 的顶部和底部边框具有锯齿状边缘 https stackoverflow com questions 18972888 make a divs top and bottom border have a jagged edge 根据
  • 如何将嵌套数据结构作为 LitElement 中的属性传递?

    在父组件中我有类似的内容 render gt const data a 1 b 1 2 3 of course this is a simplified version of the code return html
  • 为什么 Nginx 以相反的顺序提供客户端 SSL DN?

    我很好奇为什么某些 Web 服务器 例如 Nginx 以相反的顺序提供客户端 SSL DN Web 应用程序将 DN 发布到 Java Web 服务 该服务尝试创建 Javajavax naming ldap LdapName http d
  • 获取 UITableView 滚动到选定的 UITextField 并避免被键盘隐藏

    我有一个UITextField在表视图中UIViewController not a UITableViewController 如果表视图位于UITableViewController 表格会自动滚动到textField被编辑以防止它被键
  • 使用 Django 表单集保存具有唯一属性的多个对象

    TL DR 如何使用表单集保存 验证具有唯一属性的多个对象 假设我有一个Machine其中有多个Settings 参见下面的型号 这些设置在机器内应具有唯一的顺序 这可以通过定义一个来完成unique together属性中的Meta的类别
  • 创建通用 Json 序列化函数

    是否可以使用 Play Framework 2 2 在 Scala 中创建一个通用函数 将任意对象序列化为 JSON 而无需提供编写器或格式化程序 例如 此非通用代码将创建给定客户的 JSON 响应 import play api libs