使用 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”对象实际上比我展示的这个例子嵌套得多。
我在想两个选择:
创建一个 CarDTO 对象来表示我的输入 JSON,执行 objectMapper.readValue(json, CarDTO.class)
,然后将 CarDTO 映射到 Car 以创建我的 List<Car>
.
首先解析 JSON 并创建最终的 List<Car>
对象。
我不想创建一个不必要的 DTO,但我也不想搞砸解析这个 JSON。
在这种情况下是否有最佳实践,这甚至是 DTO 的有效使用吗?
使用 DTO。
尽管您 可以 从 json 直接反序列化到您的域 class,但它们的结构不同,因此您必须创建自定义反序列化器...不要在家尝试做这个。我去过那里,完全不值得这么麻烦。
使用DTO将json解析为POJO,然后将DTO映射到域对象。
这会将传输与域对象分离,允许两者自由更改,只有映射代码受到影响。它也更容易编写、理解、测试和调试。
我有一些 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”对象实际上比我展示的这个例子嵌套得多。
我在想两个选择:
创建一个 CarDTO 对象来表示我的输入 JSON,执行
objectMapper.readValue(json, CarDTO.class)
,然后将 CarDTO 映射到 Car 以创建我的List<Car>
.首先解析 JSON 并创建最终的
List<Car>
对象。
我不想创建一个不必要的 DTO,但我也不想搞砸解析这个 JSON。
在这种情况下是否有最佳实践,这甚至是 DTO 的有效使用吗?
使用 DTO。
尽管您 可以 从 json 直接反序列化到您的域 class,但它们的结构不同,因此您必须创建自定义反序列化器...不要在家尝试做这个。我去过那里,完全不值得这么麻烦。
使用DTO将json解析为POJO,然后将DTO映射到域对象。
这会将传输与域对象分离,允许两者自由更改,只有映射代码受到影响。它也更容易编写、理解、测试和调试。