杰克逊将json属性反序列化为对象

时间:2013-09-25 15:19:48

标签: java json jackson

我需要反序列化以下json:

{
    //...
    "foo_id":1
    //...
}

进入类Foo的对象,其id属性设置为foo_id json属性。

我需要在自定义反序列化器中执行此操作。 最简单的方法是什么?

我想以某种方式将json“转换”为

{
    //...
    "foo_id":{
        "id":1
    }
    //...
}

然后将其委托给杰克逊。

在这种情况下,对象的类型为Foo,但还有其他可能不属于此类的对象。此外,在这种情况下,json是一个数字,但我想支持它是否也是一个字符串。 所以,我需要一种通用的方式来做到这一点,这就是为什么我认为委托给杰克逊可能是一个好主意。

不允许注释。假设您已经为此属性编写了反序列化器。

2 个答案:

答案 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)。