Атрибут пересылки Джексона вместо внешнего объекта - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть объект, который используется в качестве типа возврата в веб-службе REST (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 и не хочу касаться класса или существующих аннотаций.Служба REST, которую я создаю, использует тот же класс и генерирует следующий json:

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

Я хотел бы получить следующий вывод (в основном игнорирую внешний элемент и использую только поле "ELEMENTS"):

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

Я также хочу игнорировать внешний объект, когда PARAMETER_DEFINITION_TABTYPE вложен в другой объект.Есть ли способ, которым я могу добиться этого с помощью аннотаций?

Спасибо!

1 Ответ

0 голосов
/ 21 декабря 2018

Вы можете определить пользовательский сериализатор и десериализатор для класса PARAMETER_DEFINITION_TABTYPE, который изменит способ обработки ObjectMapper.

Это объясняется в вики Jackson How-To: Custom Serializers, если вы не можете добавить новые аннотации в класс PARAMETER_DEFINITION_TABTYPE, вам следует использовать пользовательский модуль .

Это более или менее приведенный ниже код.Проблема здесь в том, что вам нужно предоставить много пользовательского кода, чтобы получить желаемое поведение.Было бы понятнее иметь отдельный класс для представления объекта 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...