gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:49:55 25 4
gpt4 key购买 nike

假设我们有以下 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 匹配的所有字段。

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

例如,对于客户 1,我们只想读回以下值,(并跳过其他属性,即使以 JSON 格式提供)

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

例如,对于客户 2,我们要读回以下值,(并跳过其他属性,即使以 JSON 格式提供)

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

使用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() 方法构造返回对象时,我可以在其中检查允许在运行时处理的字段列表。

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

浏览其他 Jackson 问题,在这里看到类似的问题,

Jackson Dynamic filtering of properties during deserialization

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

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

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

这可能会导致大量开销。

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

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

类似于,

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

BeanDeserializerModifier curBeanDeserializerModifier =
getBeanDeserializerModifierInstance();

curBeanDeserializerModifier.setPropertiesToConsider(propertiesToFilter2);

谢谢

最佳答案

关于java - 仅反序列化选定的属性名称 (Jackson),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36788307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com