java - 使用属性值中的序列化 JSON 反序列化 JSON
问题描述
这是我收到的 JSON:
{
"Type": "Notification",
"Id": "dc8872fa-dda3-5d97-808f-2b54ad904167",
"Message": "[{\"CarNo\":\"123\",\"TransactionNo\":\"1234\",\"ReceiptNo\":\"12345\",\"Date\":\"05/09/21\",\"Time\":\"124204\"},{\"CarNo\":\"3425\",\"TransactionNo\":\"12912\",\"ReceiptNo\":\"1030010619\",\"Date\":\"05/09/21\",\"Time\":\"124204\"},{\"CarNo\":\"3425\",\"TransactionNo\":\"12912\",\"ReceiptNo\":\"1030010619\",\"Date\":\"05/09/21\",\"Time\":\"124204\"}]",
}
我想将消息映射到类Event
:
public class Event {
private String Type;
private String MessageId;
private List<Item> Message;
}
public class Item {
private String CarNo;
private String TransactionNo;
private String ReceiptNo;
private String LineNo;
private String Date;
private String Time;
}
由于消息属性的值是一个字符串,我很难将它映射到列表。我应该如何将收到的 JSON 映射到定义的 POJO?
解决方案
这可以通过杰克逊使用自定义来完成JsonDeserializer
:
public class JsonStringListDeserializer<T> extends JsonDeserializer<List<T>> {
@Override
public List<T> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
if (value == null) {
return Collections.emptyList();
}
return new ObjectMapper().readValue(value, new TypeReference<>() {
});
}
}
然后可以将反序列化器用于以下message
属性Event
:
@JsonProperty("Message")
@JsonDeserialize(using = JsonStringListDeserializer.class)
private List<Item> message;
顺便说一句,您应该为类的成员使用小写的驼峰式名称(message
而不是Message
)。@JsonProperty
您仍然可以通过使用注解在 JSON 中使用大写属性,如上面的代码 ( @JsonProperty("Message")
)。
推荐阅读
- python - 在 xarray 中切片经度坐标穿过 0
- scala - 使用 Spark Scala 连接两个数据框
- mysql - 如何将 MySQL 查询转换为等效的 Oracle sql 查询
- excel - 如何从excel文件中复制自定义函数
- android - 将图像从 android studio 上传到 mysql
- jquery - jQuery:在事件侦听器中调用方法只会导致每隔一段时间出现正确的行为
- react-native - 无法安装 expo-cli
- webrtc - 如何找到当前的麦克风媒体流并应用约束 - WEBRTC
- php - php中的while循环后for循环不起作用
- flutter - 重复的命名参数 - 如何在颤动的身体中添加一个以上的孩子?