【问题标题】:How to avoid too many classes in jackson Java?如何避免jackson Java中的类太多?
【发布时间】:2021-07-14 05:53:22
【问题描述】:

我有 JSON 序列化和反序列化是在 java 中使用 Jackson 完成的。 我有很多 JSON 字段要序列化和反序列化我有多个单成员类,有没有更好的方法来做到这一点?

我对使用 Jackson 库没有任何限制,这是我在大多数情况下都使用的库。

public class Data{
    public String type;
    public int id;
    public Attributes attributes;
    public Relationships relationships;
}

public class Category{
    public Data data;
}

public class Service{
    public Data data;
}

public class Priority{
    public Data data;
}

public class Status{
    public Data data;
}

public class User{
    public Data data;
}

public class Relationships{
    public Category category;
    public Service service;
    public Priority priority;
    public Status status;
    public User user;
}

public class Root{
    public Data data;
}

我正在序列化的 JSON 示例如下所示。

{
  "data": {
    "id": 111,
    "type": "op type",
    "attributes": {
      "title": "Some title"
    },
    "relationships": {
      "category": {
        "data": {
          "type": "category",
          "id": 1
        }
      },
      "service": {
        "data": {
          "type": "service",
          "id": 3
        }
      },
      "priority": {
        "data": {
          "type": "priority",
          "id": 1
        }
      },
      "status": {
        "data": {
          "type": "status",
          "id": 3
        }
      },
      "user": {
        "data": {
          "type": "user",
          "id": 3
        }
      }
    }
  }
}

【问题讨论】:

  • stackoverflow.com/questions/1957406/… - 不要手动创建类!自动生成的代码是带有数据类的标准过程
  • @MartinFrank 感谢您的建议,我不手动创建类,我使用 jsonschema2pojo,但是将它们作为依赖项导入对我没有帮助,我需要创建用于序列化的对象。
  • 您也可以使用JsonNodeMap 反序列化到/从json 字符串
  • @pratap 感谢您的建议,但 Jackson 对象映射器似乎是一种更清洁的方式,当然可以争论,但是一旦我使用 JSONNode 它必须在一些局部变量中捕获,并且将所有 JSON 字段作为局部变量传递并不容易。最后,我们来创建对象,我觉得 Jackson 对象映射器更好
  • 是的,我同意创建对象映射器比 JsonNode 或 Map 更简洁。但就像你说的,你需要创建很多类。也许您可以尝试创建内部类。但它不会减少课程的数量。

标签: java json jackson


【解决方案1】:

由于Category、Service等有相同的字段data,如果手动创建类,可以只创建一个普通类DataWrapper。但我也看到你说你使用 jsonschema2pojo 而不是手动创建类。

public class Data{
    public String type;
    public int id;
    public Attributes attributes;
    public Relationships relationships;
}

public class DataWrapper {
    public Data data;
}

public class Relationships{

    public DataWrapper category;
    public DataWrapper service;
    public DataWrapper priority;
    public DataWrapper status;
    public DataWrapper user;
}

public class Root{
    public Data data;
}

【讨论】:

  • 创建DataWrapper 与使用Data 作为字段类型相比有什么优势?
  • @Mustafa DataWrapper 是一个包装器,其中包含 Data 类的一个字段。它替换类CategoryServicePriorityStatusUser,而不是替换Data。所以类的数量从 5 个减少到 1 个。
猜你喜欢
  • 2013-08-09
  • 2013-02-26
  • 2020-02-04
  • 1970-01-01
  • 2011-09-29
  • 2020-08-26
  • 2022-11-05
  • 2016-09-08
  • 2023-03-08
相关资源
最近更新 更多