我应该使用POJO还是JSONObject进行REST调用

roh*_*hit 7 java serialization json jackson

最近,我偶然发现了我的新团队大量使用JsonObject进行剩余数据交换的情况。他们的观点是在使用pojo时,我们与其余服务紧密绑定,而jsonObject提供了自由。同样,它避免了不必要的数据序列化,同时大大减少了类数。

我有几点要面对他们:

  1. Pojo给数据赋予了更多含义,我们正在使用正确的数据类型保存数据。
  2. 如果我们只需要json的10个字段中的2个字段,则可以使用 @JsonIgnore

我不知道反序列化的确切成本,但是我不知何故应该没有太大的区别。

有人可以帮助我了解应采取的观点吗?

请提供使用POJO和JSONObject的利弊。

谢谢

Pra*_*nna 8

我发现拥有pojos有以下优点

1)可读性-您将不会真正了解复杂json的结构。编写一个简单的get将需要知道json的结构。请参考我文章的“基于JSON对象的POJO”部分-> https://medium.com/tech-tablet/programming-went-wrong-oops-38d83058885

2)提供类型检查-我们可以轻松地将猫分配给狗,甚至在运行时甚至都不知道。

3)通过组合和封装感觉更面向对象-使用POJO可以轻松理解设计师的观点。是具有HAS-A车轮的IS-A车辆的汽车。

4)您可以选择要反序列化的内容,然后仅将其保留在内存中-当使用JSON对象反序列化刚刚通过网络接收到的对象时,无法使用JSON对象选择必须反序列化的内容并存储到内存中。如果您有一个1 MB大小的对象,其中只有200字节是您的有效负载,那么如果不使用POJO,我们最终将整个1 MB对象保存在内存中。

5)允许使用集合并以清晰的方式对其进行流操作-JsonNode中不存在对流操作的本机支持。我们将需要使用可以避免的StreamStupport对象。

6)允许跨框架引用。通过一些注释,您可以选择将特定的字段映射到数据库客户端-在为数据库使用ORM框架时,很容易注释实体并将其映射到数据库模式。

7)自然支持设计模式

8)最小化非本地依赖性-为什么必须使用JsonNode或本机Java中本身没有的等效项?特别是如果它具有上述缺点。

如果您担心与pojo一起使用的仪式(例如有吸气剂,二传手等),请查看“龙目岛”。该库将帮助您以简洁的方式创建pojos,并仍然获得上述好处。

另一方面,如果您要处理的是一个难以更改的旧API,该API会以动态更改的响应进行响应,那么JsonNode是一个快速的选择。


Ris*_*are 7

这实际上取决于情况和应用程序的性质。如果您要接收的数据没有固定的结构/字段名称/数据类型,或者一直在变化,那么使用JsonObject当然更有意义。

另一方面,如果它具有固定的结构并且涉及访问字段的操作,则最好使用pojo。它具有更好的IMO可读性。


Bis*_*wal 5

视情况而定:

  • 使用 Pojo :

    1. 如果数据字段像其名称一样是固定的,请键入 use Pojos,因为它将清晰且易于阅读。
    2. 如果在很多地方使用的话重构会更容易。
    3. 如果你想将这些数据保存在数据库中,那么数据的修改也很容易。假设您的pojo中有一个数据在执行计算时使用,但您不想将其保存在数据库中(因此您可以简单地通过使用@Transientjava中的关键字来完成,但如果您使用了JsonObject,这将需要一些代码变化)。
    4. 假设您不想在响应中传递空值,您可以通过使用 java.io.pojos 轻松完成此操作@JsonInclude(Include.NON_EMPTY)
  • 使用 JsonObject:

    1. 如果数据字段的类型或结构不固定,那么您将无法将其映射到 pojo 中。