【问题标题】:How to instantiate beans in custom way with Jackson?如何使用 Jackson 以自定义方式实例化 bean?
【发布时间】:2011-04-18 08:27:37
【问题描述】:

在使用 Jackson 库从 JSON 反序列化时,以自定义方式(而不是通过调用默认构造函数)实例化 bean 的最佳和最简单的方法是什么?我发现有可以实现的JsonDeserializer 接口,但我不太确定如何将它们全部连接到ObjectMapper

更新 #1:我认为我的问题需要更多细节。默认情况下,Jackson 的反序列化器使用默认构造函数来创建 crete beans。我希望能够通过调用外部工厂来实现 bean 的实例化。所以我需要的只是一个需要实例化的bean类。工厂将返回实例,然后可以将其提供给 Jackson 用于财产人口等。

请注意,我不关心字符串或数字等简单/标量值的创建,我感兴趣的只是 bean。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    一些可能有帮助的事情......

    首先,您可以使用@JsonCreator 定义要使用的替代构造函数(所有参数必须使用@JsonProperty 注释,因为字节码没有名称),或者静态工厂。它仍然是值类的一部分,但可以帮助支持不可变对象。

    其次,如果您想要真正的自定义反序列化过程,您可以查看https://github.com/FasterXML/jackson-docs/wiki/JacksonHowToCustomSerializers,其中解释了如何注册自定义反序列化器。

    Jackson 目前缺少的一件事是对构建器样式对象的支持;有一个添加支持的功能请求(并且计划在将来开发人员有时间时添加支持)。

    【讨论】:

      【解决方案2】:

      您将反序列化器放在您想要将 json 映射到的 Java 对象上:

      @JsonDeserialize(using = PropertyValueDeserializer.class)
      public class PROPERTY_VALUE implements Serializable{
      

      然后在反序列化器中你可以例如做:

      @Override
      public PROPERTY_VALUE deserialize(JsonParser jsonParser,
                          DeserializationContext deserializationContext) 
                 throws IOException, JsonProcessingException {
      
          String tmp = jsonParser.getText(); // {
          jsonParser.nextToken();
          String key = jsonParser.getText();
          jsonParser.nextToken();
          String value = jsonParser.getText();
          jsonParser.nextToken();
          tmp = jsonParser.getText(); // }
      
          PROPERTY_VALUE pv = new PROPERTY_VALUE(key,value);
          return pv;
      }
      

      如果您不想使用注解,则需要向映射器传递一个DeserializerProvider,它可以为给定类型提供正确的反序列化器。

      mapper.setDeserializerProvider(myDeserializerProvider);
      

      对于构造函数——当然你可以通过在反序列化器中调用工厂来生成目标类:

          String value = jsonParser.getText();
          jsonParser.nextToken();
          tmp = jsonParser.getText(); // }
      
          MyObject pv = MyObjectFactory.get(key);
          pv.setValue(value);
          return pv;
      }
      

      但是我可能误解了你的更新

      【讨论】:

      • 谢谢海科。 Jackson 默认使用 bean 的默认构造函数来创建实例。我想做的是通过使用外部工厂来实际创建 bean。我会在一秒钟内用一些细节更新我的问题。
      • 不使用注释怎么办?
      • 通过使用混入注解,不需要直接添加到类本身,而是添加到其他“混入”类。这使得使用第三方库的注释方法成为可能。
      猜你喜欢
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多