Может ли Genson обрабатывать общие вложенные поля на объектах?
По сути, у меня есть несколько объектов Java, которые я хочу сериализовать в JSON с минимальной головной болью. Прямо сейчас я использую Tomcat, Джерси и Дженсон.
Я обнаружил, что что-то вроде этого не работает (это, конечно, игрушечный пример) с Генсоном:
public class Main {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.mapOfSets = new HashMap<>();
Set<String> set0 = new HashSet<>();
set0.add("0");
Set<String> set1 = new HashSet<>();
set1.add("1");
set1.add("11");
Set<String> set2 = new HashSet<>();
set2.add("2");
set2.add("22");
set2.add("222");
mc.mapOfSets.put("set0", set0);
mc.mapOfSets.put("set1", set1);
mc.mapOfSets.put("set2", set2);
try {
String json1 = new Genson().serialize(mc.mapOfSets);
System.out.println(json1);
String json = new Genson().serialize(mc);
System.out.println(json);
} catch (TransformationException | IOException e) {
e.printStackTrace();
}
}
}
class MyClass {
public Map<String, Set<String>> mapOfSets;
}
Вывод вышесказанного таков:
{"set1":["1","11"],"set0":["0"],"set2":["2","222","22"]}
{"mapOfSets":{"empty":false}}
Что было приятно в Genson, так это то, что я просто поместил его в папку WebContent, и он использовался вместо того, что было в комплекте с Jersey - никаких дополнительных настроек не требовалось. Если есть действительно простой подход к получению объекта, подобного описанному выше, для сериализации в JSON без необходимости написания какого-либо конвертера для каждой схемы, я бы с радостью использовал это с Джерси вместо Генсона, но Генсон не подвел меня таким образом далеко в недостатках.
Итак - как мне сделать массаж Дженсона для правильной сериализации - или что это за библиотека, которая безболезненно обрабатывает подобные вещи?
Спасибо!
2 ответа
Я использую Guice для удовлетворения своих потребностей в инъекции зависимостей, поэтому мне было сложно интегрировать Джексона в мой проект на Джерси. Поскольку Генсон не делал то, что я хотел, я решил снова попробовать Джексона. Я пытался изменить несколько вещей, пока это не сработало, пробуя разные предложения по SO и Google.
А теперь следующий результат дает ожидаемый результат в моем проекте Sandbox:
ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
String jsonData = mapper.writeValueAsString(mc);
System.out.println(jsonData);
{"mapOfSets":{"set1":["1","11"],"set0":["0"],"set2":["2","222","22"]}}
Я автор Генсонов. Я только что проверил, это ошибка, дженерики прекрасно работают в Genson, за исключением этого конкретного случая... Если вы можете подождать до завтра, я выпущу новый выпуск сегодня вечером, содержащий исправление плюс некоторые незначительные новые функции. Я обновлю свой ответ, когда это будет сделано.
РЕДАКТИРОВАТЬ Ошибка исправлена и релиз 0,94 перенесен в публичный репозиторий Maven, он должен быть доступен в течение пары часов максимум. Вот некоторые изменения в этом выпуске. Пожалуйста, попробуйте и подтвердите, если это решит вашу проблему. Спасибо:)