为什么使用Playframework转换为JSON如此冗长?

coo*_*eze 1 json scala playframework playframework-json

我只是比较如何在java中将对象序列化和反序列化为JSON.

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

User user = mapper.readValue(jsonInString, User.class);
Run Code Online (Sandbox Code Playgroud)

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

为什么它不能像java w/Jackson一样"工作"?

我有我的模型,我想简单地读/写然后到JSON.使用Java,我没有任何样板代码可供编写.

Dyl*_*lan 8

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

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

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

ObjectMapper杰克逊是没有这些东西.它在很大程度上依赖于反射,因此如果您通过混淆器提供类文件,它可能会完全破坏.即使你不这样做,也不能保证在编译时你试图反序列化的类实际上是可反序列化的.

Scala的部分内容是它提供了非常强大的编译时保证.隐含(例如类似于类Reads和类Writes)因素,尽管它们带有一些样板/开销.

该游戏开发者听到您的投诉,但它是非常不可能的Reads,并Writes会自行消失.相反,他们试图通过提供一个找到这样的代码的宏来减少冗长:

implicit val personReads = Json.reads[Person]
Run Code Online (Sandbox Code Playgroud)

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

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