我的目标是使用Jackson将JSON字符串字段转换为正确的类。
我有以下类:
public class AnimalRecord {
private String id;
private String source;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "source", include = JsonTypeInfo.As.EXTERNAL_PROPERTY)
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = CatProbeMetadata.class, name
= "catProbeMetadata"),
@JsonSubTypes.Type(value = DogProbeMetadata.class, name = "dogProbeMetadata"),
})
private AnimalMetadata metadata;
除了这个类,我还有一个 DB 表格,其中存储了 AnimalRecord(AnimalRecord=行) 的记录。 AnimalMetadata 是基于该类的 source 不同的 JSON 字符串。每个 source 都有自己的 metadata 和类定义。在此示例中,当 source 为“cat”时,在从字符串进行反序列化时 CatProbeMetadata 类将作为输出。
问题是我不确定在从数据库读取行时该怎么办。我有以下方法:
private class ActiveProbeWrapper implements RowMapper<ActiveProbeRecord> {
@Override
public ActiveProbeRecord mapRow(ResultSet rs, int rowNum) throws SQLException {
String id= rs.getString("id");
String source= rs.getString("source");
Animalmetadata metadata = // NOT SURE WHAT TO DO HERE;
ActiveProbeRecord record = new ActiveProbeRecord(deviceId,segment, source, metadata);
return record;
}
}
我需要将DB中的字符串转换为正确的类实例,但我的元数据字符串将不包括源代码(因为它在元数据JSON之外)。
问题:我是否必须将“source”字段添加到元数据本身,或者还有其他更好的方法可以做到这一点,我可能错过了吗?
更新示例: DB行的示例: id | source | metadata 1 | catSource | {"catName": "Mewy"} 2 | dogSource | {"dogName": "Barky"}
当我从DB中读取行时,我想使用source
字段将metadata
反序列化为正确的类-String --> CatMetadata
setSource
设置为具有类型和猫名的catRecord
,我认为source
应该只是cat
,而metadata
应该包括内部类的所有元数据(如猫名)。能解释一下吗? - TheUnrealAnimalMetadata
并让 Jackson 找出要使用的实际子类)。catName
和dogName
只是AnimalMetadata
子类中可能不同的字段示例。它们也可能包含完全相同的字段集,但那样的话,为什么您需要不同的子类就不清楚了。希望我的回答有意义。 - Forketyforkswitch(record.source)
,并基于此选择要解析的类。这与在注释中指定相同信息并没有太大区别。 - Forketyfork