Json忽略JsonSubTypes上的属性

时间:2014-03-27 12:05:36

标签: json jackson

我有一个代表我的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)时,它被忽略了。问题是我不想将这个忽略属性注释添加到我的所有类中,而是将它添加到顶部并希望将其传播到所有类型。

2 个答案:

答案 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);
相关问题