我正在尝试反序列化一个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编写的库生成的。
答案 0 :(得分:3)
我认为杰克逊遇到了问题,因为您作为创建者委派的方法没有readOnly
字段的参数。所以,而不是默默地忽略这个缺失的参数杰克逊抛出一个错误(良好的行为)。尝试使用JsonIgnoreProperties
注释。我之前不需要使用,但是对于反序列化,您可以明确表示创建者不需要的字段。
哦,this似乎也有关系。
答案 1 :(得分:3)
请注意,您的问题不是该类具有Jackson无法识别的属性,而是JSON具有属性。因此,您可能需要阅读this wiki page。
如前所述,@JsonIgnoreProperties
可以在这里使用,因为将注释添加到类中不需要字段或设置器,这与@JsonIgnore
不同。此外,它可用于忽略任何和所有未知属性。
答案 2 :(得分:0)
@JsonIgnoreProperties({"propX", "propY"})
在课堂上工作得很好!