【问题标题】:Jackson deserialize json property into objectJackson 将 json 属性反序列化为对象
【发布时间】:2013-09-25 15:19:47
【问题描述】:

我需要反序列化以下json:

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

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

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

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

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

然后将其委托给杰克逊。

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

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

【问题讨论】:

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

标签: java json jackson


【解决方案1】:

看看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);    
}
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2023-03-13
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多