【问题标题】:Custom JSON mapping using Jackson使用 Jackson 的自定义 JSON 映射
【发布时间】:2013-11-25 10:54:14
【问题描述】:

我有一个 POJO

class Product {
    String name;
    Size size;
} 

所以,我想将反序列化 JSON 映射到我的 POJO。如果我的 JSON 中有这两个属性,那不是问题。

但就我而言,有时大小不会成为 JSON 的一部分。可能有第三个属性“类型”,我将根据它设置我的大小。我不想在我的 POJO 中包含“类型”。是否有任何杰克逊注释可以做到这一点?

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    编写您的自定义反序列化器:

    SimpleModule module =
      new SimpleModule("ProductDeserializerModule",
          new Version(1, 0, 0, null));
    module.addDeserializer(Product.class, new ProductJsonDeserializer());
    
    mapper = new ObjectMapper();
    mapper.registerModule(module);
    

    //...

    class ProductJsonDeserializer extends JsonDeserializer<Product>
    {
      @Override
      public Product deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
      {
        // handle here if exist a third attribute 'type' and create the product 
      }
    }
    

    更多信息在这里:http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

    【讨论】:

    • 会试试这个。还有一件事:实际上我正在调用一个 WebResource,我试图将它的 JSON 输出映射到我的 POJO。像这样的东西: webResource.accept(MediaType.APPLICATION_JSON).get(Product.class) 我如何用这个注册我的 ProductJsonDeserializer?
    【解决方案2】:

    找到了一个非常简单的解决方案!

    当尝试将 JSON 属性映射到我的 POJO 的属性时,它只会检查是否存在设置器。

    例如,如果JSON中有一个属性type,它会尝试在我的POJO中命中一个名为setType(obj)的方法,而不管是否存在一个名为type的属性。

    这对我有用!我只是在这个 setter 中设置了我的其他属性。

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 2015-04-04
      • 2012-07-08
      • 1970-01-01
      • 2021-05-02
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多