1

我只是在比较如何在 java 中将对象序列化和反序列化到 JSON 和从 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 那样“工作”?

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

4

1 回答 1

8

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

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

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

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

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

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

implicit val personReads = Json.reads[Person]

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

implicit val personReads = (
  (__ \ 'name).read[String] and
  (__ \ 'age).read[Int] and
  (__ \ 'lovesChocolate).read[Boolean]
)(Person)
于 2015-11-09T20:55:27.190 回答