Jacskon中的同一个解串器可以用于列表或单个项目吗?

时间:2016-05-16 16:49:51

标签: java json jackson json-deserialization

我们的一台服务器有一个API端点,有时会在列表中返回MAC地址(最多3个),有时会返回单个MAC地址

可以这样:

{
    "mac_addrs": [
        "11:11:11:11:11:11",
        "22:22:22:22:22:22"
    ]
}

或者只是:

{
    "mac_addr": "33:33:33:33:33:33"
}

现在,在Java方面,我有一个小的PoJo(class MacAddress)在构造函数中使用String,将其转换为二进制并提供一些很好的方法,例如验证器,制造商提取器......这样的事情。

我创建了一个Jacskson自定义反序列化器,给定一个包含MAC地址的String,将其转换为该MacAddress类的实际实例:

@Override
public MacAddress deserialize(JsonParser jp, DeserializationContext ctxt) 
       throws IOException {
    JsonToken currentToken = jp.getCurrentToken();
    if (currentToken.equals(JsonToken.VALUE_STRING)) {
        return new MacAddress(jp.getValueAsString());
    }
    return null;
}

它可以用作从RESTful API(来自JSON)加载的类中的注释:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Device {
    @JsonDeserialize(using = MacAddressDeserializer.class)
    @JsonSerialize(using = MacAddressSerializer.class)
    public MacAddress mac;
    // . . . moar and moar thingies

现在,问题是:

有没有办法告诉杰克逊(版本2.5.1,但我可以增加它,如果它有帮助)用List<MacAddress>建模一个类并使用相同的解串器?基本上,能够按照&#34;告诉杰克逊的东西,我不会骗你:你将会收到一个MAC地址列表,所以对于列表中的每个项目,我希望您使用我已在某处定义的MacAddressDeserializer.class&#34;

我找到了很多示例,但所有这些示例都解释了如何为list of objectssingle objectforcing a list even if there's only one object实现反序列化器,但我和#39;我不得不避免编写两个反序列化器,一个用于MacAddress,另一个用于List<MacAddress>。有两种方法可以使用相同的反序列化器类吗?

提前谢谢。

0 个答案:

没有答案