有可能利用杰克逊从波乔那里获得价值吗



Jackson在将字段命名为JSON时考虑了许多因素。是否可以反向使用这些因素,以便根据序列化后的名称检索pojo中字段的值?

例如,给定bean

public class Bean{
    private Bean2 prop;
    @JsonProperty("property")
    public Bean2 getProp();
}

是否可以仅给定配置的ObjectMapper、字符串"property"Bean的实例来获得prop的值?

我知道反思,所以如果我能得到"prop""getProp",我就可以去了。

您可以将给定的JSON字符串反序列化为Bean。然后可以使用JsonNodeget()方法找到属性,然后使用treeToValue()方法将值获取为POJO。

例如

        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);
        }

您可以将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();

相关内容

  • 没有找到相关文章

最新更新