我有一个代表我的JSON的Scala案例类如下:
class MyJSON(x: Int, typeA: TypeA, typeB: TypeB)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(Array(
new Type(value = classOf[ClassA], name = "ClassA"),
new Type(value = classOf[ClassB], name = "ClassB")))
trait TypeA {
...
...
}
在我的ClassA中,我有一些从JSON反序列化的字段。但我也希望如果某些字段不属于我的Class对象,我希望它们被忽略。我所做的是我在MyJSON类上使用了@JsonIgnoreProperties(ignoreUnknown = true)注释,如下所示:
@JsonIgnoreProperties(ignoreUnknown=true)
class MyJSON(x: Int, typeA: TypeA, typeB: TypeB)
当我的输入JSON有一些未知字段时,它失败了。但是当我在我的案例中将这个注释移动到我的一个类(比如ClassA)时,它被忽略了。问题是我不想将这个忽略属性注释添加到我的所有类中,而是将它添加到顶部并希望将其传播到所有类型。
答案 0 :(得分:0)
我找到了一个非常优雅的解决方案。我使用Jackson MixIn机制在运行时实际向我的目标类型添加了额外的注释。这是我做的:
@JsonIgnoreProperties({ Array("field1", "field2") })
abstract class MixInAnnotations{}
在我创建ObjectMapper的JSONMarshaller类中,我执行以下操作:
val mapper = new ObjectMapper()
mapper.registerModule(new MyApplicationModule)
MyApplicationModule现在看起来像:
public class MyApplicationModule extends com.fasterxml.jackson.databind.module.SimpleModule {
public MyApplicationModule() {
super(MyApplicationModule.class.getSimpleName());
// Add the corresponding MixIn Annotations to ignore the JSON properties
setMixInAnnotation(MyTargetClass1.class, MixInAnnotations.class);
setMixInAnnotation(MyTargetTrait.class, MixInAnnotations.class);
}
}
我调用setter方法将MixInAnnotations添加到目标类。这里的目标类也可以是具有JsonSubTypes Annotation的特征。因此,我并没有使用@JsonIgnoreProperties批注来污染我的所有类型。
答案 1 :(得分:0)
试试这个
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);