我需要反序列化以下json:
{
//...
"foo_id":1
//...
}
进入类Foo的对象,其id
属性设置为foo_id
json属性。
我需要在自定义反序列化器中执行此操作。 最简单的方法是什么?
我想以某种方式将json“转换”为
{
//...
"foo_id":{
"id":1
}
//...
}
然后将其委托给杰克逊。
在这种情况下,对象的类型为Foo,但还有其他可能不属于此类的对象。此外,在这种情况下,json是一个数字,但我想支持它是否也是一个字符串。 所以,我需要一种通用的方式来做到这一点,这就是为什么我认为委托给杰克逊可能是一个好主意。
不允许注释。假设您已经为此属性编写了反序列化器。
答案 0 :(得分:0)
看看this。这是一个我认为可以帮助您获得一些想法的代码。
public class MyDeserializer extends JsonDeserializer< Message >
{
@Override
public Message deserialize( JsonParser jp, DeserializationContext arg1 ) throws IOException,
JsonProcessingException
{
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(jp);
Class<? extends Message> subClass = null;
Iterator<Entry<String, JsonNode>> elementsIterator = root.getFields();
while (elementsIterator.hasNext())
{
Entry<String, JsonNode> element = elementsIterator.next();
String name = element.getKey();
if ("foo_id".equals(name))
{
if(element.getValue().isInt())
subClass = FooInteger.Class;
break;
}
}
if (subClass == null) return null;
return mapper.readValue(root, subClass);
}
}
答案 1 :(得分:0)
您是否考虑过使用mix-in annotations?使用Jackson 2.2,您还可以使用转换器进行两步处理(@JsonDeserialize(converter=MyConverter.class
)。