如何解决用Jackson自动将字符串反序列化为对象
上下文
说你有
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>
,并添加了一个实用方法,该方法使用{{1将String
转换为Custom
}}。这相当不令人满意。
解决方法
您需要实现自定义解串器或转换器,将其用于将给定的有效负载转换为所需的类型。您可以使用的一种技巧是创建新的fname = input("Enter file name: ")
fh = open(fname)
count = 0
val = 0
for line in fh:
if not line.startswith("X-DSPAM-Confidence:"):
continue
found = line.find(":")
data = float(line[found+1:])
val += data
count += 1
avg = val / count
print("Average spam confindence",avg)
并将其用于内部反序列化。
用法示例:
ObjectMapper
,
您需要创建一个自定义反序列化器。
public class CustomDeserializer extends StdDeserializer<Custom> {
public CustomDeserializer() {
this(null);
}
public CustomDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Custom deserialize(JsonParser jp,DeserializationContext ctxt)
throws IOException,JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
int id = (Integer) ((IntNode) node.get("id")).numberValue();
String name = node.get("name").asText();
...
return new Custom(id,name,...);
}
}
并在Custom
类上注册反序列化器:
@JsonDeserialize(using = CustomDeserializer.class)
public class Custom {
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。