如何在以下示例中使用相同的@jsonproperty name?

时间:2013-05-08 05:22:57

标签: json jackson

在任何时候我都只会设置一个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;
}

1 个答案:

答案 0 :(得分:1)

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

您的案例代表了一种非常罕见的情况。在不同的上下文中,您有一个具有两种不同含义的字段。通常这不是一种有利的数据格式,因为它在另一端给消费者添加了混乱的逻辑......他们需要在每种情况下都要理解“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相比,您的情况要好得多。

如果您无法更改,则会留下custom serialization