杰克逊在将字段序列化为JSON时会考虑很多因素。是否可以反过来使用这些因子,以便根据序列化后的名称检索pojo中字段的值?
例如,给定bean
public class Bean{
private Bean2 prop;
@JsonProperty("property")
public Bean2 getProp();
}
是否可以获得prop
的值,只提供已配置的ObjectMapper
,字符串"property"
和Bean
的实例?
我知道反思,所以如果我能得到"prop"
或"getProp"
,我会非常高兴。
答案 0 :(得分:4)
您可以将给定的JSON字符串反序列化为Bean
。
然后,您可以使用get()
JsonNode
方法查找属性,之后您可以使用treeToValue()
方法获取POJO值。
E.g。
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readValue(new ObjectMapper().writeValueAsString(bean), JsonNode.class);
JsonNode propertyNode = rootNode.get("property");
Class<?> propertyField = null;
Field []fields = Bean.class.getDeclaredFields();
for (Field field : fields){
//First checks for field name
if(field.equals("property")){
propertyField = field.getType();
break;
}
else{
//checks for annotation name
if (field.isAnnotationPresent(JsonProperty.class) && field.getAnnotation(JsonProperty.class).value().equals("property")) {
propertyField = field.getType();
break;
}
//checks for getters
else {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), Bean.class);
Method getMethod = pd.getReadMethod();
if (getMethod.isAnnotationPresent(JsonProperty.class) && getMethod.getAnnotation(JsonProperty.class).value().equals("property")) {
propertyField = field.getType();
break;
}
}
}
}
if(propertyField != null){
Object o = mapper.treeToValue(propertyNode, propertyField);
}
答案 1 :(得分:2)
您可以将Bean
序列化为Json字符串,然后将相同的Json字符串反序列化为Map(只需调用ObjectMapper.readValue(JsonString, Map.class)
),然后您可以Map.get("property")
进行。这是一个单线解决方案:
String property = ((Map<String, Object>)mapper.readValue(mapper.writeValueAsString(bean), Map.class)).get("property").toString();