2015-09-02 3 views
1

Предположительно у меня есть POJO как это:Можете ли вы группу JSON сериализации по типу недвижимости

class POJO1 { 
    TypeA getFirst(); 
    TypeA getSecond(); 
    TypeB getThird(); 
    String getName(); 
} 

Я ищу, чтобы создать пользовательский сериализатор, что вывод будет таким:

{ "A" : [ serializationOf(first), serializationOf(second) ], "B" : serializationOf(second), "name" : valueOfName() } 

Но вот catch, это не относится к POJO1. Значение такое же сериализации имеет место для этого другого POJO:

class POJO2 { 
    TypeA getFirst(); 
    TypeA getSecond(); 
    TypeB getThird(); 
    String getName(); 
} 

Или любой класс, который имеет TypeA или TypeB свойства, а это означает, что методы могут измениться. Я предпочитаю не нацеливаться на базовый класс или интерфейс, поскольку мой сериализатор должен использоваться людьми, разрабатывающими другие классы, которые я даже не представлял себе. Я смотрел на регистрацию сериализаторов TypeA и TypeB, но они, похоже, не позволяют мне изменять ключ объекта json и не группировать подобные типы в любом случае.

+0

В чем разница между POJO1 и POJO2. Что именно вы сериализуете? Геттеры? –

+0

Вы можете иметь базовый класс, который распространяется как POJO1, так и POJO2. Джексон, например, поддерживает полиморфную сериализацию. –

+0

Я обновил ограничения вопроса, чтобы объяснить, почему базовый класс не является решением –

ответ

0

Вдохновленный сообщением Jackson: How to add custom property to the JSON without modifying the POJO Я нашел то, что искал. Это 4 двойственные:

  • Добавить фильтр, который удаляет все типы я хочу группы
  • сделать этот фильтр применяется для типов контейнеров я небезразлична (объект в моем случае)
  • Добавить пользовательский сериалайзер что расширяет BeanSerializerBase с использованием методы в связанном ответе
  • Добавить пользовательские группы код сериализации в этой расширенной BeanSerializerBase, используя его _props: BeanWriter [] защищенным переменной

Это дает мне нет лишних размышлений, и я не должен знать базовый тип в любом коде. Я не теряю никаких аннотаций к бинам, которые сериализуются, как определено другим dev (так как я использую собственные свойства Jackson's OwnWriters).

я собрал POC над на https://github.com/drdamour/jackson-serializer-fun

1

Кажется, что документ JSON, который вы хотите получить, не имеет той же структуры, что и 2 класса, поэтому вы не можете использовать привязку для POJO1 и POJO2. Однако вы можете определить новый класс с той же структурой, что и JSON, который вы хотите получить. Например.

class BindedPojo { 
    TypeA[] A; 
    TypeA B; 
    String name; 

    BindedPojo(TypeA a, TypeA b, String n) { 
     A = new TypeA[]{a, b}; 
     B = b; 
     name = n; 
    } 
} 

Затем сериализовать объект с именем p1 типа либо POJO1 или POJO2:

BindedPojo bp = new BindedPojo(p1.getFirst(), p1.getSecond(), p1.getName()); 

И только сериализации bp к JSON, например, с методом writeValueObjectMapper. Это решение не требует POJO1 и POJO2, чтобы иметь общий базовый класс. Он также позволяет избежать изменений в исходном коде POJO1 и POJO2.

+0

да, это то, что у меня есть, но я должен использовать весь беспорядок для построения BindedPojo ... в основном я компилирую неизвестные типы в известный тип. Но это вызывает слишком петли отражения (mine & jacksons), которые я не слишком доволен –

+0

Если отражением является проблема, я бы рекомендовал определить интерфейс с геттерами и реализовать каждый POJO. Этот [ответ] (http://stackoverflow.com/a/31030804/1413133) может быть полезен в этом случае. –

+0

Я не могу предположить интерфейс. Завтра Dev может добавить TypeA getZ() –

Смежные вопросы