Java Jackson将json属性反序列化为对象

Java Jackson将json属性反序列化为对象,java,json,jackson,Java,Json,Jackson,我需要反序列化以下json: { //... "foo_id":1 //... } 将其id属性设置为Foo\u idjson属性的Foo类对象 我需要在自定义反序列化程序中执行此操作。 实现这一点最简单的方法是什么 我在考虑以某种方式将json“转换”为 { //... "foo_id":{ "id":1 } //... } 然后把这个委托给Jackson 在本例中,对象的类型为Foo,但其他对象可能不属于此类。同样,

我需要反序列化以下json:

{
    //...
    "foo_id":1
    //...
}
将其
id
属性设置为
Foo\u id
json属性的Foo类对象

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

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

{
    //...
    "foo_id":{
        "id":1
    }
    //...
}
然后把这个委托给Jackson

在本例中,对象的类型为Foo,但其他对象可能不属于此类。同样,在本例中,json是一个数字,但我想支持它是否也是一个字符串。 所以,我需要一种通用的方法来实现这一点,这就是为什么我认为授权给杰克逊可能是一个好主意

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

请查看。下面是一段代码,我认为它可能会帮助您获得一些想法

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);    
}
}
公共类MyDeserializer扩展JsonDeserializer
{
@凌驾
公共消息反序列化(JsonParser jp,反序列化上下文arg1)引发IOException,
JsonProcessingException
{
ObjectMapper映射器=(ObjectMapper)jp.getCodec();
ObjectNode root=(ObjectNode)mapper.readTree(jp);

类您考虑过使用吗?在Jackson 2.2中,您还可以使用转换器进行两步处理(
@jsondeseligate(converter=MyConverter.Class
).

什么是不允许注释?根本不允许注释?您可以使用注释为jsonproperty指定反序列化器,并在其中区分整数和字符串…我正在尝试为Jackson编写一个模块。其想法是保持POJO不变。我已经编写了一个BeanDeserializer,在其中我可以n将任何反序列化程序分配给该属性。现在的问题是反序列化程序。因此,在反序列化程序中,您需要检查foo_id字段和值,如果该值是字符串的实例,则返回例如foostr type,如果是整数,则返回foointeger type。如果我是对的,我可以在此处发布一些代码作为答案!?这些代码可能会有很大帮助,谢谢,但这并不是我在这里需要的。问题是我不知道Foo类中的id属性是数字还是字符串,或者其他什么。理想情况下,反序列化程序不应该关心它。我需要的是检查Foo_id字段,并创建一个Foo类的实例,其id设置为Foo_id属性,无论是什么。请尽你所能。我们可能从中得到一些想法。谢谢!