Java Jacskon中的同一反序列化程序可以用于列表项还是单个项?
我们的一台服务器有一个API端点,它有时返回列表中的MAC地址(最多3个),有时返回单个MAC地址 可以这样说:Java Jacskon中的同一反序列化程序可以用于列表项还是单个项?,java,json,jackson,json-deserialization,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(类MacAddress),它在构造函数中接受一个字符串,将其转换为二进制,并提
{
"mac_addrs": [
"11:11:11:11:11:11",
"22:22:22:22:22:22"
]
}
或者只是:
{
"mac_addr": "33:33:33:33:33:33"
}
现在,在Java端,我有一个小PoJo(类MacAddress
),它在构造函数中接受一个字符串
,将其转换为二进制,并提供一些很好的方法,例如验证器、制造商提取器。。。诸如此类的事情
我创建了一个Jacskson自定义反序列化程序,在给定包含MAC地址的字符串时,将其转换为该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)加载的类中的注释:
现在,问题是:
有没有办法告诉Jackson(版本2.5.1,但如果有帮助的话,我可以增加它)用列表对类进行建模,并对单个类使用相同的反序列化器?基本上,我可以告诉Jackson这样的话:“我没有骗你:你会收到一个MAC地址列表,所以对于列表中的每一项,我希望你使用我已经在某处定义的MacAddressDeserializer.class
”
我已经找到了很多例子,但它们都解释了如何为a、或a、或for实现反序列化程序,但我希望避免编写两个反序列化程序,一个用于MacAddress
,另一个用于List
。有没有一种方法可以同时使用同一个反序列化器类
提前谢谢。为什么不直接在ObjectMapper
上注册MacAddressDeserializer
,而不添加注释?我想这会给你预期的结果。哦!谢谢你的回复。。。好。。答案是“因为我不知道怎么做”,但你给了我一个很好的暗示。我要开始挖了!:)谢谢@varren这里是文档,顺便说一句,如果您只想将字符串映射到POJO,我认为您不需要自定义反序列化程序。单字符串构造函数/工厂方法应该足够多,还有一个提示。。。如果您想将POJO序列化回字符串,可以在MacAddress
string getter上使用@JsonValue
。感谢所有提示!最大的问题(由于我缺乏知识)是我将Jackson与Google API结合使用,我看不清楚在哪里注册自定义序列化程序。但是你已经给了我很多提示了!我将尝试研究一下:)再次感谢:+1:为什么不直接在ObjectMapper
上注册MacAddressDeserializer
,而不添加注释?我想这会给你预期的结果。哦!谢谢你的回复。。。好。。答案是“因为我不知道怎么做”,但你给了我一个很好的暗示。我要开始挖了!:)谢谢@varren这里是文档,顺便说一句,如果您只想将字符串映射到POJO,我认为您不需要自定义反序列化程序。单字符串构造函数/工厂方法应该足够多,还有一个提示。。。如果您想将POJO序列化回字符串,可以在MacAddress
string getter上使用@JsonValue
。感谢所有提示!最大的问题(由于我缺乏知识)是我将Jackson与Google API结合使用,我看不清楚在哪里注册自定义序列化程序。但是你已经给了我很多提示了!我将尝试研究一下:)再次感谢:+1:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Device {
@JsonDeserialize(using = MacAddressDeserializer.class)
@JsonSerialize(using = MacAddressSerializer.class)
public MacAddress mac;
// . . . moar and moar thingies