0

在任何时候,我都只会设置一个 setter 方法,但两者的 JsonProperty 名称应该相同。当我编译这个时,我得到了一个例外。如何为两者设置相同的名称。?

public String getType() {
    return type;
}

@JsonProperty("Json")
public void setType(String type) {
    this.type = type;
}

public List<TwoDArrayItem> getItems() {
    return items;
}

@JsonProperty("Json")
public void setItems(List<TwoDArrayItem> items) {
    this.items = items;
}
4

1 回答 1

1

Jackson 倾向于支持注释支持的常见场景和良好的设计选择。

您的案例代表了一种非常罕见的情况。您有一个字段在不同的上下文中具有两种不同的含义。通常这不会是一种有利的数据格式,因为它在另一端给消费者添加了混乱的逻辑......他们需要知道“Json”属性在每种情况下应该意味着什么。如果您只使用两个不同的属性名称,对消费者来说会更干净。然后只需检查每个属性的存在就足以知道它得到了哪个替代方案。

您的 Java 类似乎也设计得很糟糕。类不应该有这种类型的上下文或模式,在一个上下文中允许一个字段,但在另一个上下文中则不允许。

由于这主要是您的设计的味道,而不是序列化逻辑,因此最好的方法可能是更正您的 Java 类层次结构:

class BaseClass {
}

class SubClassWithItems {
    public List<TwoDArrayItem> getItems() {
        return items;
    }

    @JsonProperty("Json")
    public void setItems(List<TwoDArrayItem> items) {
        this.items = items;
    }
}

class SubClassWithType {
    public String getType() {
        return type;
    }

    @JsonProperty("Json")
    public void setType(String type) {
        this.type = type;
    }
}

这样,您的类就没有基于某些运行时状态的不同字段集。如果运行时状态正在驱动您的类包含哪些字段,那么您不会比仅使用Map.

如果你不能改变它,你就剩下自定义序列化

于 2013-05-08T05:46:34.480 回答