我有以下情况:
public class A {
private String someProperty;
private String anotherProperty;
public A() {}
// getter/setter
ObjectMapper
配置如下(默认启用,但值得注意的是为了理解问题的要点):
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
以及如下所示的输入 JSON:
{
"someProperty": "someValue",
"anotherProperty":"anotherValue",
"unwantedProperty":"unwantedValue"
}
当使用
objectMapper.readValue(bytes, A.class)
反序列化此 JSON 时,正如预期的那样,它给了我一个例外:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "unwantedProperty"
现在,我想做的事情如下:
A.class
unwantedProperty
是 JSON 的一部分,但我不需要它,所以我想忽略它。新的、未知的属性,仍然会引发
UnrecognizedPropertyException
。我希望为此使用 MixIn 类之类的东西的原因是,实际上,输入 JSON 有几十个字段。我不想将我的
A.class
与数十个未使用的属性(上面带有 @JsonIgnore
)弄乱,这样它只包含我真正想要的字段。如果意外地出现了新房产,我想被迫去看一下。
我认为我可以通过使用 MixIn 来允许这种行为,如下所示:
public abstract class AMixIn {
@JsonIgnore private String unwantedProperty;
与:
objectMapper.addMixIn(A.class, AMixIn.class);
但这似乎没有效果。我还尝试在
AMixIn
中创建吸气剂并给予这些 @JsonIgnore
,但这也没有结果。
我在这里使用 MixIn 的方式不正确吗?我想要做的事情是否可能(如上面三点所述)?或者,有更好的方法吗?
我尝试过搜索,但我的用例有点深奥,所以我运气不太好。
问题1的答案:
您可以指示 Jackson 忽略未知属性。
我倾向于配置
ObjectMapper
来忽略它们,
这是一些示例代码:
private ObjectMapper mapper;
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
// This matches the Fuse Mapper configuration.
builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
mapper = builder.build();
您还可以对类进行注释以忽略未知属性。 这是一些示例代码:
@jsonignoreproperties(ignoreunknown = true)
public class A
{
...
注意问题2:
为了使 use-mixin-to-ignore-fields-in-json 策略发挥作用,
要忽略的字段必须存在于类中。
就你而言,
这意味着
class A
必须有一个字段“unwantedProperty”才能使 mixin 正常工作。
解决问题2和3的方向
您不能使用 Jackson 的 MixIn 功能来解决任一问题
问题2或问题3。
反而,
您将需要编写一个自定义解串器。
我建议您还使用自定义 Jackson 注释
配置忽略无法识别字段的列表
并让您的自定义反序列化器仅抛出异常
对于不属于的无法识别的字段
忽略的无法识别的字段列表。
嗯,显示了我的搜索能力;一如既往,杰克逊提供了“一些”方法来做任何需要做的事情。如果它可能对其他人有帮助: 存在
@JsonIgnoreProperties
注释,除了
ignoreUnknown
属性(我已经知道)之外,还支持在反/序列化期间忽略的属性列表(通过 value()
)(我不知道) .这与上面的预期解决方案不太相同,但是将这些属性放在类头中的@JsonIgnoreProperties({ ... })
而不是类主体中对我来说是一个足够好的妥协。
所以,解决方案是:
@JsonIgnoreProperties({"unwantedProperty"})
public class A {
// same as above...
}
不过,如果有一个 MixIn 解决方案可以将这些东西完全解耦,我仍然希望看到它。如果几天后没有任何进展,我会接受我自己的答案。
我在这里找到的使用混合的最干净的方式记录: