Может ли 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, он должен быть доступен в течение пары часов максимум. Вот некоторые изменения в этом выпуске. Пожалуйста, попробуйте и подтвердите, если это решит вашу проблему. Спасибо:)

Другие вопросы по тегам