使用 Jackson Mixins 有选择地忽略仅提供的属性

问题描述 投票:0回答:3

我有以下情况:

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"

现在,我想做的事情如下:

  1. 仅反序列化由
    A.class
  2. 显式提供的属性
  3. 使用 MixIn 忽略所有不需要的、已知的属性。例如,我知道
    unwantedProperty
    是 JSON 的一部分,但我不需要它,所以我想忽略它。
  4. 如果我的 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 的方式不正确吗?我想要做的事情是否可能(如上面三点所述)?或者,有更好的方法吗?

我尝试过搜索,但我的用例有点深奥,所以我运气不太好。

java jackson
3个回答
1
投票

问题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 注释 配置忽略无法识别字段的列表 并让您的自定义反序列化器仅抛出异常 对于不属于的无法识别的字段 忽略的无法识别的字段列表。


0
投票

嗯,显示了我的搜索能力;一如既往,杰克逊提供了“一些”方法来做任何需要做的事情。如果它可能对其他人有帮助: 存在

@JsonIgnoreProperties

注释,除了

ignoreUnknown
属性(我已经知道)之外,还支持在反/序列化期间忽略的属性列表(通过
value()
)(我不知道) .
这与上面的预期解决方案不太

相同,但是将这些属性放在类头中的

@JsonIgnoreProperties({ ... })而不是类主体中对我来说是一个足够好的妥协。

所以,解决方案是:

@JsonIgnoreProperties({"unwantedProperty"}) public class A { // same as above... }

不过,如果有一个 MixIn 解决方案可以将这些东西完全解耦,我仍然希望看到它。如果几天后没有任何进展,我会接受我自己的答案。
    

我在这里找到的使用混合的最干净的方式记录:

© www.soinside.com 2019 - 2024. All rights reserved.