Десериализация Джсона Джексона без внутренних классов
У меня есть вопрос, касающийся десериализации 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 ответа
Не должно быть никакой разницы между статическим внутренним классом Name
и класс верхнего уровня с тем же именем. Время выполнения Джексона не должно быть в состоянии осмысленно различать две ситуации.
Вы пытались переместить Name
класс из User
, превращая его в класс высшего уровня? Это должно все еще работать как прежде.
редактировать: я только что попробовал это, и он отлично работает, когда имя является классом верхнего уровня. Я полагаю, что в качестве примера для краткости использовался внутренний класс.
Мистер. Ответ Скаффмана правильный. Единственное, что следует упомянуть, это то, что в отличие от JAXB Джексон обычно не требует от вас указывать классы, с которыми вы работаете, за исключением корневого класса (и даже не всегда, если вы используете полиморфную обработку).