杰克逊转发属性,而不是外部对象

时间:2018-12-21 14:14:26

标签: java jackson

我有一个对象,在REST Web服务(jax-rs)中用作返回类型。该对象包含一个字段,该字段是另一种类型的数组。示例:

  @Name("PARAMETER_DEFINITION_TABTYPE")
  @TableOfDefinition
  @XmlType(
      name = "parameter_DEFINITION_TABTYPE"
  )
  class PARAMETER_DEFINITION_TABTYPE {

    @XmlElement(
        name = "parameter_definition_rectype",
        nillable = true
    )
    public PARAMETER_DEFINITION_RECTYPE[] ELEMENTS;

    @Override
    public String toString() {
      return ELEMENTS == null ? null : java.util.Arrays.toString(ELEMENTS);
    }
  }

我使用所有现有的注释来创建我的SOAP Web服务,并且不想触碰类或现有的注释。我创建的REST服务使用相同的类并生成以下json:

{"parameter_definition_rectype": [
   {
       "name": "abc"
   },
   {
       "name": "abss"
   }
]}

我想获得以下输出(基本上忽略外部元素,仅使用“ ELEMENTS”字段):

[
   {
       "name": "abc"
   },
   {
       "name": "abss"
   }
]

当PARAMETER_DEFINITION_TABTYPE嵌套在另一个对象中时,我也想忽略外部对象。 有没有办法通过使用批注来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以为PARAMETER_DEFINITION_TABTYPE类定义一个自定义的序列化器和反序列化器,这将改变ObjectMapper处理它的方式。

这在Wiki Jackson How-To: Custom Serializers中有解释,如果您不能向PARAMETER_DEFINITION_TABTYPE类添加新注释,则应使用a custom module

或多或少下面的代码。这里的问题是,您必须提供许多自定义代码才能获得所需的行为。拥有一个单独的类来表示JSON对象会更清洁,因为它不同于XML对象:

public static void main(String[] args) throws Exception {
    SimpleModule module = new SimpleModule("WrapperModule", new Version(1, 0, 0, null));
    module.addSerializer(Wrapper.class, new WrapperSerializer(Wrapper.class));
    module.addDeserializer(Wrapper.class, new WrapperDeserializer(Wrapper.class));

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(module);

    Wrapper in = new Wrapper();
    in.elements = new String[]{"a", "b", "c"};

    String json = mapper.writeValueAsString(in);
    System.out.println(json);

    Wrapper out = mapper.readValue(json, Wrapper.class);
    System.out.println(Arrays.toString(out.elements));
}


public static class Wrapper {

    public String[] elements;

}

public static class WrapperSerializer extends StdSerializer<Wrapper> {

    public WrapperSerializer(Class<Wrapper> t) {
        super(t);
    }

    @Override
    public void serialize(Wrapper w, JsonGenerator gen, SerializerProvider provider) throws IOException {
        provider.defaultSerializeValue(w.elements, gen);
    }

}

public static class WrapperDeserializer extends StdDeserializer<Wrapper> {

    public WrapperDeserializer(Class<Wrapper> c) {
        super(c);
    }

    @Override
    public Wrapper deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
        Wrapper w = new Wrapper();
        w.elements = ctx.readValue(p, String[].class);
        return w;
    }
}