【发布时间】:2021-01-01 14:28:23
【问题描述】:
上下文
假设你有:
public class Dto {
private String name;
private String List<Custom> customs;
// getters and setters...
}
和
public class Custom {
private String something;
private String else;
// getters and setters...
}
您的 Spring MVC RestController 收到 Dto 的列表:
@PostMapping
public String create(@RequestBody @Valid List<Dto> dtos) {
return myService.process(features);
}
输入
但是,您知道将数据发送到您的控制器的客户端服务将发送如下内容:
[
{
"name": "Bob",
"customs": [
"{\n \"something\": \"yes\",\n \"else\": \"no\"\n }"
]
}
]
请注意List<Custom> 实际上最终会以List<String> 的形式接收。请假设这不能在客户端更改,我们必须在服务器端处理它。
问题
是否有 Jackson 注释会自动获取输入 String 并尝试将其序列化为 Custom 类?
尝试
一些没有用的东西,包括:
@JsonSerialize(using = ToStringSerializer.class)
private List<Custom> customs;
随着
public Custom(String json) {
try {
new ObjectMapper().readerFor(Custom.class).readValue(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
事实上,我们不得不将customs 类型更改为List<String>,并添加一个实用方法,该方法使用ObjectMapper 将String 转换为Custom。这是相当不满意的。
【问题讨论】:
-
那是因为在您的尝试中您使用了“JsonSerialize”这个注释用于响应。您需要使用
JsonDeserialize与此您可以做您的自定义反序列化器,应该工作 -
@Marco 好点。尽管如此,我的问题主要是关于获得自动的东西。当输入
String与所需的Custom类匹配时,我宁愿不必维护自定义反序列化器。 -
示例负载不是有效的
JSON。我想,当你想掩盖真实的人时,你打破了它。我说的对吗? -
@MichałZiober 抱歉,我忘了转义引号。这是固定的。
标签: java spring spring-boot spring-mvc jackson