使用 DTO 将 JSON 映射到最终对象,还是只解析 JSON?

Use DTO to map JSON to final object, or just parse JSON?

我有一些 json 对象,看起来像这样:

{
   "make":"Volvo",
   "model":"240",
   "metadata":{
      "color":"white",
      "year":"1986",
      "previousOwner":"Joe",
      "condition":"good"
   }
}

我想把这个JSON变成List<Car>,它由以下对象组成:


public class Car {

    private String make;

    private String model;

    private CarMetadata carMetadata;

}

public class CarMetadata {

    private Body body;

    private History history;

}

public class Body {

    private String color;

    private String condition;

}

public class History {

    private String previousOwner;

    private String year;

}

所以本质上关键是我想把它变成 (Car) 的对象是非常嵌套的,而我的 JSON 不是很嵌套。实际上,“Car”对象实际上比我展示的这个例子嵌套得多。

我在想两个选择:

  1. 创建一个 CarDTO 对象来表示我的输入 JSON,执行 objectMapper.readValue(json, CarDTO.class),然后将 CarDTO 映射到 Car 以创建我的 List<Car>.

  2. 首先解析 JSON 并创建最终的 List<Car> 对象。

我不想创建一个不必要的 DTO,但我也不想搞砸解析这个 JSON。

在这种情况下是否有最佳实践,这甚至是 DTO 的有效使用吗?

使用 DTO。

尽管您 可以 从 json 直接反序列化到您的域 class,但它们的结构不同,因此您必须创建自定义反序列化器...不要在家尝试做这个。我去过那里,完全不值得这么麻烦。

使用DTO将json解析为POJO,然后将DTO映射到域对象。

这会将传输与域对象分离,允许两者自由更改,只有映射代码受到影响。它也更容易编写、理解、测试和调试。