java - 使用 Jackson 将 json 字符串转换为通用 Map
问题描述
我从不同的服务获取以下对象,我需要将其解析为我的服务中的 POJO。传入的对象看起来像:AddressMessage.java
public class AddressMessage {
@NotEmpty
@JsonProperty("id")
private String id;
@NotEmpty
@JsonProperty("address")
private String address;
public String getId() {
return this.id;
}
public String getAddress() {
return this.address;
}
@SuppressWarnings("unchecked")
@JsonProperty("data")
public void unpackNested(Map<String, Object> rawMessage) {
Map<String, String> data = (Map<String, String>) rawMessage.get("data");
this.id = (String) data.get("id");
this.address = (String) data.get("address");
}
}
传入的数据如下所示:
{“data”: { “id” : “sampleId”, “address”: “sampleAddress” }}
我尝试将传入的 json 字符串解析为普通对象,但这不起作用:
private void publishMessage(String rawMessage, AMQP.BasicProperties props) throws IOException {
Object json = objectMapper.readValue(rawMessage, Object.class);
log.debug(objectMapper.writeValueAsString(json));
我还尝试接收原始消息并使用对象映射器将其直接映射到类,如下所示:
private void publishMessage(String rawMessage, AMQP.BasicProperties props) throws IOException {
AddressMessage addressMessage = objectMapper.readValue(rawMessage,
AddressMessage.class);
}
上述代码例外:
Unexpected character ('“' (code 8220 / 0x201c)): was expecting double-quote to start field name
我想从对象中提取“id”和“address”属性,但由于解析错误,我一直遇到异常。一些指导将不胜感激,谢谢!
另外:我目前没有使用“unpackNested”方法,但我想我会把它扔在那里以防它引发任何想法
解决方案
您可以@JsonCreator
像这样在构造函数上使用注释:
@JsonCreator
public AddressMessage(@JsonProperty("data") Map<String, Object> rawJson) {
this.id = rawJson.get("id").toString();
this.address = rawJson.get("address").toString();
}
这告诉杰克逊在反序列化时使用该构造函数。
推荐阅读
- python - TF: 如何解决 ValueError: Variable ...weight 已经存在,不允许。你的意思是设置reuse=True
- r - Rmarkdown:是否可以对第一个标题进行制表符?
- c++ - 如何从OpenCV中的目录中依次读取文件并用于处理?
- python - 在python中读取输入文件
- excel - 浓缩一个大公式
- android - Instagram 等视频过滤器并保存在 SDCARD 中
- c# - 无法在 Android 4.4 中从 javascript 调用 Sanitize 方法,而在 Android 4.1 中同样有效
- c# - 并发保存数据
- flow - 基于属性是否存在的流不相交联合
- android - 在发送任何页面活动之前将 JS 注入 WebView