使用 Mapstruct 从 DTO 中的 JSON Array/JSON 对象映射到 JPA DB POJO 中的字符串
Mapping from JSON Array/JSON Object in DTO to String in JPA DB POJO using Mapstruct
我的要求如下
我的 DTO API 将有一个字段可以接收 JSON 数组或 JSON 对象作为输入。
例如
{
"name" : { "firstName" : "ABC", "lastName" : "pqr", "email" : "abc.pqr@xyz.com" },
"skills" : ["Java", "JS", "Mongo", "JPA"]
}
这需要使用域 POJO 中的 JPA 作为字符串存储在数据库中
字段名称:
"{\"firstName\":\"ABC\",\"lastName\":\"pqr\",\"email\":\"abc.pqr@xyz.com\"}"
现场技能:
"[\"Java\",\"JS\",\"Mongo\",\"JPA\"]"
在通过 GET API 检索数据库时应该发生相反的情况,字符串应该在响应负载中转换回 JSON。
是否有使用 mapstruct 库执行此操作的示例
Mapstruct 不能很好地映射未知状态,但如果一个字段总是 JSONArray
或 JSONObject
那么它是可能的。在未知状态的情况下,(例如它被键入为 Object
)使用 @SubclassMapping
注释可能是一个选项。 See here for more information about subclass mappings
在任何一种情况下,都需要引入一种从 JSONArray
到 String
然后再返回的方法。 JSONObject
.
相同
例如:
String from(JSONArray array) {
return array.toJSONString( JSONStyle.NO_COMPRESS );
}
String from(JSONObject object) {
return object.toJSONString( JSONStyle.NO_COMPRESS );
}
JSONArray toArray(String array) {
try {
return (JSONArray) new JSONParser( JSONParser.MODE_JSON_SIMPLE ).parse( array );
}
catch ( ParseException e ) {
throw new RuntimeException( e );
}
}
JSONObject toObject(String object) {
try {
return (JSONObject) new JSONParser( JSONParser.MODE_JSON_SIMPLE ).parse( object );
}
catch ( ParseException e ) {
throw new RuntimeException( e );
}
}
假设 DTO
被命名为 ProgrammerDto
并且域对象 Programmer
向映射器添加另外 2 个方法将允许两者之间的转换。假设 POJO 字段与 DTO 字段的调用相同,否则您将需要添加映射。
ProgrammerDto map(Programmer programmer);
Programmer map(ProgrammerDto programmerDto);
ps。 map 方法是抽象的,或者其他方法是默认的。这取决于使用的是抽象 class 还是接口。
我的要求如下
我的 DTO API 将有一个字段可以接收 JSON 数组或 JSON 对象作为输入。
例如
{
"name" : { "firstName" : "ABC", "lastName" : "pqr", "email" : "abc.pqr@xyz.com" },
"skills" : ["Java", "JS", "Mongo", "JPA"]
}
这需要使用域 POJO 中的 JPA 作为字符串存储在数据库中
字段名称:
"{\"firstName\":\"ABC\",\"lastName\":\"pqr\",\"email\":\"abc.pqr@xyz.com\"}"
现场技能:
"[\"Java\",\"JS\",\"Mongo\",\"JPA\"]"
在通过 GET API 检索数据库时应该发生相反的情况,字符串应该在响应负载中转换回 JSON。
是否有使用 mapstruct 库执行此操作的示例
Mapstruct 不能很好地映射未知状态,但如果一个字段总是 JSONArray
或 JSONObject
那么它是可能的。在未知状态的情况下,(例如它被键入为 Object
)使用 @SubclassMapping
注释可能是一个选项。 See here for more information about subclass mappings
在任何一种情况下,都需要引入一种从 JSONArray
到 String
然后再返回的方法。 JSONObject
.
例如:
String from(JSONArray array) {
return array.toJSONString( JSONStyle.NO_COMPRESS );
}
String from(JSONObject object) {
return object.toJSONString( JSONStyle.NO_COMPRESS );
}
JSONArray toArray(String array) {
try {
return (JSONArray) new JSONParser( JSONParser.MODE_JSON_SIMPLE ).parse( array );
}
catch ( ParseException e ) {
throw new RuntimeException( e );
}
}
JSONObject toObject(String object) {
try {
return (JSONObject) new JSONParser( JSONParser.MODE_JSON_SIMPLE ).parse( object );
}
catch ( ParseException e ) {
throw new RuntimeException( e );
}
}
假设 DTO
被命名为 ProgrammerDto
并且域对象 Programmer
向映射器添加另外 2 个方法将允许两者之间的转换。假设 POJO 字段与 DTO 字段的调用相同,否则您将需要添加映射。
ProgrammerDto map(Programmer programmer);
Programmer map(ProgrammerDto programmerDto);
ps。 map 方法是抽象的,或者其他方法是默认的。这取决于使用的是抽象 class 还是接口。