Jackson 1.8.0 ObjectMapper для сериализации / десериализации произвольных классов - PullRequest
1 голос
/ 27 июля 2011

Как я могу сказать Jacksons ObjectMapper сериализовать свои собственные классы? Нужно ли предоставлять сериализатор?

Рассмотрим следующий пример:

public class MyType {
    private int a;
    private String b;
    // Getters and Setters
}

// TODO: configure ObjectMapper, such that the following is true:

objectMapper.canDeserialize(type)

Я полагаю, что Джексон все делает автоматически, без указания "стратегии" десериализации, поскольку сериализация MyType уже работает.

Спасибо за вашу помощь!

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Да, он может сериализовать POJO без специального сериализатора. Но проблема в вашем случае заключается в том, что все ваши свойства «скрыты». По умолчанию Джексон будет искать:

  • Открытые поля и методы получения (getXxx ())
  • Сеттеры (setXxx ()) любой видимости

Чтобы заставить Джексона использовать личные поля, вы можете аннотировать их с помощью @JsonProperty или изменять уровни проверки видимости по умолчанию, если вы хотите, чтобы были найдены все частные (или защищенные, видимые в пакете) поля. Это можно сделать с помощью аннотации (@JsonAutoDetect) или путем определения глобальной проверки видимости.

2 голосов
/ 27 июля 2011

У меня была проблема с моим пользовательским классом, потому что у него были неоднозначные методы установки. Если вы аннотируете один из методов, которые вы хотите использовать в качестве средства установки, с помощью @JsonSetter, то все в порядке.

public class MyType {
    private int a;

    @JsonSetter
    public void setA(int a) {...}

    public void setA(String a) {...}
}

Без аннотации objectMapper.deserialize(...) завершается ошибкой. Внутри выдается исключение, которое дает вам больше информации, но возвращается только пойманное и ложное.

...