Java 仅反序列化选定的属性名称(Jackson)

Java 仅反序列化选定的属性名称(Jackson),java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,假设我们有以下JSON { "id": "imgsId1", "type": "Fruits", "name": "Tropical", "image": { "url": "images/img1.jpg", "width": 300, "height": 300 }, "thumbnail": { "url": "images/thumbnails/img1

假设我们有以下JSON

{
    "id": "imgsId1",
    "type": "Fruits",
    "name": "Tropical",
    "image":
     {
         "url": "images/img1.jpg",
         "width": 300,
         "height": 300
    },
    "thumbnail":
    {
        "url": "images/thumbnails/img11.jpg",
        "width": 50,
        "height": 50
    }
}
在Java类中,所有字段都与上面的JSON匹配

每次要反序列化的字段列表取决于发送信息的客户

例如,对于customer 1,我们只想读回以下值,(即使在JSON中提供,也跳过其他属性)

例如,对于customer 2,我们希望读回以下值,(即使在JSON中提供,也跳过其他属性)

使用Jackson反序列化JSON时,是否可以提供上述数组,其中包括需要反序列化的字段

ImageInfo obj1 = (ImageInfo)objectMapper.readValue(jsonStr, ImageInfo.class);
更新:

在网上研究时,我发现其中一个选择是通过使用

FilterProvider filterProvider = new SimpleFilterProvider().addFilter("filterName1", 
                    SimpleBeanPropertyFilter.serializeAllExcept(propertiesToFilter1));

objectMapper.setFilters(filterProvider);
但我认为这是好的,如果我们想继续为多个客户重复使用相同的“filterName1”

在这个场景中,有点不同,因为我们定制了每个客户可以更新的字段列表。因此,每个客户都有不同的JSON字段列表,可以在不同的类中更新

如果我们开始为每个客户定义不同的过滤器名称,这将是一个很长的列表,查找将对性能产生影响

所以我一直在寻找解决方案,在使用objectMapper.readValue()方法构造back对象时,我可以检查允许在运行时处理的字段列表

更新2(2016年4月25日):

通过杰克逊的其他问题,我们看到了一个类似的问题

通过创建自定义的“静态ObjectMapper”,使用下面列出的方法,这种方法的问题是我们多次运行反射API

  • Jackson解析器第一次使用 将JSON反序列化为Java对象时的反射API

  • 第二次,因为我们无法获取由 Jackson解析器,为了将数据填充到另一个对象中,我们再次需要运行反射API来填充另一个对象

这可能会导致大量的开销

使用上面提供的链接中定义的方法,我认为使用“BeandSerializerModifier”似乎是最好的方法。现在的问题是,因为我们也使用基于工厂的方法来初始化ObjectMapper,所以我们不想为不同的客户硬编码所有数组

想检查是否可以向字符串[]数组提供运行时要考虑的属性列表给“BeanDeserializerModifier”?

类似于

String[] propertiesToFilter2 = {"type","image.url", "image.width"};

BeanDeserializerModifier curBeanDeserializerModifier = 
            getBeanDeserializerModifierInstance();

curBeanDeserializerModifier.setPropertiesToConsider(propertiesToFilter2);

谢谢

使用带有配置参数的@JsonIgnoreProperties


我不确定是否有可能使用注释动态配置反序列化

我建议使用
静态ObjectMapper
创建一个类。在这个类中,您可以创建不同的反序列化实现。然后,应用程序的业务逻辑应该决定应该为哪个客户使用哪个实现。在不同的实现中,您可以像配置注释一样配置
ObjectMapper

第二种解决方案是为每个客户反序列化完整的
json
,并让业务逻辑决定使用Pojo的哪些字段/对象。这还需要在应用程序中实现

在业务逻辑中实现配置的好处是,您将拥有更干净的代码,并且在一个地方为每个客户进行配置



您如何知道您必须为哪个客户反序列化内容以及何时不进行反序列化?此JSON文件可以通过Web(Form POST)或FTP接收。对于所有客户,我们使用相同的Java类文件。感谢您的回复@如果我不想考虑来自所有客户的文件的这些字段,那么JsonIgnoreProperties({“pw”、“email”、“name”、“devices”、“lastModified”、“created”})将起作用。这里的场景是针对不同的客户,我们想要定制我们想考虑的领域。在输入数据中不同的客户机之间有区别,或者请检查我更新的评论。这将对性能产生影响,因为我们需要多次运行Java反射API。@mike39最后,您必须在
objectMapper
中注册
BeanDeserializerModifier
才能使用它。还是我错了?
FilterProvider filterProvider = new SimpleFilterProvider().addFilter("filterName1", 
                    SimpleBeanPropertyFilter.serializeAllExcept(propertiesToFilter1));

objectMapper.setFilters(filterProvider);
String[] propertiesToFilter2 = {"type","image.url", "image.width"};

BeanDeserializerModifier curBeanDeserializerModifier = 
            getBeanDeserializerModifierInstance();

curBeanDeserializerModifier.setPropertiesToConsider(propertiesToFilter2);