【问题标题】:Why is converting to JSON so verbose with Playframework?为什么使用 Playframework 转换为 JSON 如此冗长?
【发布时间】:2015-11-09 20:27:59
【问题描述】:

我只是比较在 java 中如何将对象序列化和反序列化与 JSON 之间的关系。

ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{'name' : 'john smith'}";

User user = mapper.readValue(jsonInString, User.class);

使用 Playframework 和 Scala,我必须创建这些读写映射器,它们非常冗长。 (见:https://www.playframework.com/documentation/2.5.x/ScalaJsonHttp

为什么它不能像 java w/Jackson 那样“工作”?

我有我的模型,我想简单地读取/写入 JSON。使用 Java,我无需编写任何样板代码。

【问题讨论】:

  • 您以一种没有意义的方式将 Play Framework 与 Scala 混为一谈。还有很多其他 JSON 库可以与 Scala 一起使用:manuel.bernhardt.io/2015/11/06/… 你想要一个 Scala 答案(“我怎样才能让它在 Scala 中变得紧凑”)还是一个 Play Framework 特定的答案(“为什么要这样玩? ?")

标签: json scala playframework playframework-json


【解决方案1】:

来自https://www.playframework.com/documentation/2.5.x/ScalaJsonInception

我们收到了一些人的抱怨,他们认为编写 Reads[TheirClass] 并不酷,因为通常像 Jackson 或 Gson 这样的 Java JSON 框架在幕后不写任何东西就可以做到这一点。 我们认为 Play2.1 JSON 序列化器/反序列化器是:

  • 完全类型安全,
  • 完全编译,
  • 在运行时未使用自省/反射执行任何操作。

杰克逊的ObjectMapper 不是这些东西。它严重依赖反射,所以如果你通过混淆器提供你的类文件,它可能会完全崩溃。即使您不这样做,在编译时也无法保证您尝试反序列化的类实际上是可反序列化的。

Scala 的部分吸引力在于它提供了非常强大的编译时保证。隐式(例如 ReadsWrites 等类型类)会影响这一点,尽管它们确实带有一些样板/开销。

Play 开发人员听到了您的投诉,但 ReadsWrites 不太可能消失。相反,他们试图通过提供一个查找如下代码的宏来使其不那么冗长:

implicit val personReads = Json.reads[Person]

并根据Person 构造函数这样解释它:

implicit val personReads = (
  (__ \ 'name).read[String] and
  (__ \ 'age).read[Int] and
  (__ \ 'lovesChocolate).read[Boolean]
)(Person)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2018-04-25
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多