0

我需要反序列化以下json:

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

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

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

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

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

然后将其委托给杰克逊。

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

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

4

2 回答 2

0

看看这个。这是我认为可以帮助您获得一些想法的代码。

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);    
}
}
于 2013-09-25T17:24:07.173 回答
0

您是否考虑过使用混合注释?使用 Jackson 2.2,您还可以使用转换器进行两步处理 ( @JsonDeserialize(converter=MyConverter.class)。

于 2013-09-25T17:34:14.583 回答