(Jackson 1.9.2)让@JsonIgnore工作:使用mixin注释和多态类型进行反序列化

时间:2011-12-07 20:22:05

标签: java json jackson deserialization

我正在尝试反序列化一个JSON字符串(提取此位以显示问题)

{
    "$type": "com.example.StringProperty",
    "value": "hello world",
    "name": "text",
    "readOnly": false
}

进入类似

的类层次结构
public class Property
{
    public String name;
    public int    type;

    Property(String pName, int pType) { name = pName; type = pType; }
}

public class StringProperty extends Property 
{
    public String value;        
    StringProperty(String pName, String pValue) {
        super(pName, String);
        value = pValue;
    }       
}

使用以下mixin注释

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="$type")
abstract public class PropertyMixin
{
    @JsonProperty
    public String name;
    //@JsonIgnore
    //public boolean readOnly;
    @JsonProperty
    public int type;

    PropertyMixin(@JsonProperty("name") String pName, @JsonProperty("type") int pType)
    {
    }
}

abstract public class StringPropertyMixin
{
    @JsonProperty
    public String value;
    //@JsonIgnore
    //public boolean readOnly;

    @JsonCreator
    public StringPropertyMixin(@JsonProperty("name") String pName, @JsonProperty("value") String value)
    {
    }
}

使用Jackson 1.9.2,我得到的错误是

Unrecognized field "readOnly" (Class com.example.StringProperty), not marked as ignorable

我尝试使用@JsonIgnore,但这没有帮助(检查我注释掉的代码的位置以了解我是如何尝试的)。我可能错过了一些东西,但我认为另一组眼睛需要看它并帮助我。

这就是反序列化环境的样子:

        objectMapper.setVisibilityChecker(objectMapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.NONE)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

        MixinRegistrations module = new MixinRegistrations();
        objectMapper.registerModule(module);

和mixin模块看起来像

@Override
public void setupModule(SetupContext context)
{
    context.setMixInAnnotations(Property.class, PropertyMixin.class);
    context.setMixInAnnotations(StringProperty.class, StringPropertyMixin.class);
}

我感谢所有的帮助。提前谢谢。

PS:我不知道这是否有所不同,但JSON是由.Net Framework v4编写的库生成的。

3 个答案:

答案 0 :(得分:3)

我认为杰克逊遇到了问题,因为您作为创建者委派的方法没有readOnly字段的参数。所以,而不是默默地忽略这个缺失的参数杰克逊抛出一个错误(良好的行为)。尝试使用JsonIgnoreProperties注释。我之前不需要使用,但是对于反序列化,您可以明确表示创建者不需要的字段。

哦,this似乎也有关系。

修改 Another question that the asker found that was useful.

答案 1 :(得分:3)

请注意,您的问题不是该类具有Jackson无法识别的属性,而是JSON具有属性。因此,您可能需要阅读this wiki page

如前所述,@JsonIgnoreProperties可以在这里使用,因为将注释添加到类中不需要字段或设置器,这与@JsonIgnore不同。此外,它可用于忽略任何和所有未知属性。

答案 2 :(得分:0)

@JsonIgnoreProperties({"propX", "propY"})

在课堂上工作得很好!