Десериализация Джсона Джексона без внутренних классов - PullRequest
3 голосов
/ 05 апреля 2010

У меня есть вопрос относительно десериализации Json с использованием Jackson. Я хотел бы десериализовать файл Json, используя такой класс: (взято из http://wiki.fasterxml.com/JacksonInFiveMinutes)

public class User 
{
    public enum Gender { MALE, FEMALE };
    public static class Name {
      private String _first, _last;
      public String getFirst() { return _first; }
      public String getLast() { return _last; }
      public void setFirst(String s) { _first = s; }
      public void setLast(String s) { _last = s; }
    }
    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;
    public Name getName() { return _name; }
    public boolean isVerified() { return _isVerified; }
    public Gender getGender() { return _gender; }
    public byte[] getUserImage() { return _userImage; }
    public void setName(Name n) { _name = n; }
    public void setVerified(boolean b) { _isVerified = b; }
    public void setGender(Gender g) { _gender = g; }
    public void setUserImage(byte[] b) { _userImage = b; }
}

Файл Json можно десериализовать с помощью так называемой «полной привязки данных»:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);

Моя проблема заключается в использовании внутреннего класса «Имя». Я хотел бы сделать то же самое без использования внутренних классов. Класс «Пользователь» стал бы таким:

import Name;
import Gender;
public class User 
{
    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;
    public Name getName() { return _name; }
    public boolean isVerified() { return _isVerified; }
    public Gender getGender() { return _gender; }
    public byte[] getUserImage() { return _userImage; }
    public void setName(Name n) { _name = n; }
    public void setVerified(boolean b) { _isVerified = b; }
    public void setGender(Gender g) { _gender = g; }
    public void setUserImage(byte[] b) { _userImage = b; }
}

Это значит найти способ указать мапперу все необходимые классы для выполнения десериализации.

Возможно ли это? Я посмотрел на документацию, но не могу найти никакого решения.

Моя потребность исходит из того факта, что я использую библиотеку Javassist для создания таких классов, и она не поддерживает внутренние или анонимные классы.

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 05 апреля 2010

Не должно быть никакой разницы между статическим внутренним классом Name и классом верхнего уровня с тем же именем. Среда выполнения Джексона не должна быть в состоянии осмысленно различать две ситуации.

Вы пытались вывести класс Name из User, превратив его в класс верхнего уровня? Это должно все еще работать как прежде.

edit: Я только что попробовал это, и он отлично работает, когда Name является классом верхнего уровня. Я подозреваю, что в качестве внутреннего класса это был внутренний класс.

1 голос
/ 05 апреля 2010

г.Ответ Скаффмана правильный.Единственное, что следует упомянуть, это то, что в отличие от JAXB Джексон, как правило, не требует от вас указывать классы, с которыми вы работаете, за исключением корневого класса (и даже не всегда, если вы используете Полиморфная обработка ).

...