如何告诉 Jackson ObjectMapper 从序列化中忽略特定类型(类)的字段(在我的 Object.class
的情况下)?
约束条件:
为了提供帮助,下面是一个单元测试,期望从序列化中忽略字段对象列表
和对象字段
,但它的方法是不正确的,它是按名称而不是按类型过滤它们。
public static class FavoriteShows {
public Simpsons favorite = new Simpsons();
public BigBangTheory preferred = new BigBangTheory();
}
public static class Simpsons {
public String title = "The Simpsons";
public List<Object> objectsList = List.of("homer", "simpson");
public Object objectField = new HashMap() {{
put("mr", "burns");
put("ned", "flanders");
}};
}
public static class BigBangTheory {
public String title = "The Big Bang Theory";
public List<Object> objectsList = List.of("sheldon", "cooper");
public Object objectField = new HashMap() {{
put("leonard", "hofstadter");
put("Raj", "koothrappali");
}};
}
public abstract static class MyMixIn {
@JsonIgnore
private Object objectField;
@JsonIgnore
private Object objectsList;
}
@Test
public void test() throws JsonProcessingException {
// GIVEN
// Right solution must work for any (MixIn(s) is out of questions) Jackson annotated class
// without its modification.
final ObjectMapper mapper = new ObjectMapper()
.addMixIn(Simpsons.class, MyMixIn.class)
.addMixIn(BigBangTheory.class, MyMixIn.class);
// WHEN
String actual = mapper.writeValueAsString(new FavoriteShows());
System.out.println(actual);
// THEN
// Expected: {"favorite":{"title":"The Simpsons"},"preferred":{"title":"The Big Bang Theory"}}
assertThat(actual).isEqualTo("{\"favorite\":{\"title\":\"The Simpsons\"},\"preferred\":{\"title\":\"The Big Bang Theory\"}}");
}
如果你正在使用mixins,你应该能够用@ JsonIgnoreType注释,让它忽略这个类。参考文件全局忽略Jackson中的类
其中一种方法是使用自定义AnnotationINSPECTOR
。
class A {
int three = 3;
int four = 4;
B b = new B();
// setters + getters
}
class B {
int one = 1;
int two = 2;
// setters + getters
}
要忽略类型为B
的所有字段:
ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
@Override
protected boolean _isIgnorable(Annotated a) {
return super._isIgnorable(a)
// Ignore B.class
|| a.getRawType() == B.class
// Ignore List<B>
|| a.getType() == TypeFactory.defaultInstance()
.constructCollectionLikeType(List.class, B.class);
}
});
String json = mapper.writeValueAsString(new A());
我有这样的Jackson注释类: 假设我不能更改我的类代码。那么,如何让ObjectMapper只覆盖field2的JsonIgnore并将其序列化为json?但我希望它忽略field4。这很简单,只需要几行代码吗? 我的常规序列化代码:
我需要一些使用MapStruct映射嵌套POJO的帮助。我需要跳过/删除目标类中所有子类的特定字段。 例如,以下是我的目标POJO 所有这些子类——,,。。。包含一个字段“”,我想在映射时忽略它。这种结构使得这些类不共享包含此字段的公共基类——“”。 我创建的映射器如下所示: 这工作。 然而,当中的子类数量很大时,它会变得很乏味。我需要明确指定每个类。 有没有人能告诉我,这是否可以用一种更通用的方
问题内容: 我想序列化一个不受我控制的POJO类,但是想避免序列化任何来自超类而不是最终类的属性。例: 您可以从示例中猜测到,该类是由JOOQ生成的,并且是从复杂的基类UpdatableRecordImpl继承的,该基类还具有一些类似于bean属性的方法,这会在序列化过程中引起问题。另外,我有几个类似的类,因此最好避免对所有生成的POJO复制相同的解决方案。 到目前为止,我已经找到以下可能的解决方
> 使用mixin技术忽略来自超类的特定字段,如下所示:我如何告诉jackson忽略一个我无法控制源代码的属性? 这样做的问题是,如果基类发生了变化(例如,其中出现了一个新的getAnything()方法),它可能会破坏我的实现。 实现一个自定义序列化程序并在那里处理问题。这在我看来有点矫枉过正。 但是,从纯设计的角度来看,最好的方法是告诉jackson我只想序列化最终类的属性,而忽略所有继承的属
问题内容: 我有一些扩展的模型类:它们定义用于包装Map的get和put方法的getter和setter。我正在尝试使用Jackson(带有RESTEasy)序列化这些类的实例,但是Jackson拒绝注意我的getter(使用注释)。而是仅序列化支持映射的键- 值对。我尝试使用禁用所有方法和字段的自动检测功能,但这并没有任何改变。有没有办法防止Jackson序列化Map,还是必须创建不扩展的新模型
考虑一个案例,我有2个对象映射器实例。我希望必须从序列化中排除使用某些自定义注释注释的字段,而其他映射器包含(忽略注释) 就像类有3个字段a,b,c和c用一些注释注释(比如@IgnoreField)(它们的n个类,每个类都有它们不应该被序列化的字段) 现在,第一个对象映射器 o1 必须仅序列化 a 和 b。而第二个对象映射器o2可以序列化a,b和c。 任何具有不同字段的类都可能发生这种情况,其中一