没有内部阶级的Json Jackson反序列化

Eto*_*zel 3 java serialization json inner-classes jackson

我有一个关于使用杰克逊的Json反序列化的问题.我想使用类似这样的类来反序列化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; }
}
Run Code Online (Sandbox Code Playgroud)

可以使用所谓的"完整数据绑定"以这种方式反序列化Json文件:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);
Run Code Online (Sandbox Code Playgroud)

我的问题是使用内部类"名称".我想在不使用内部类的情况下做同样的事情."用户"类将变为:

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; }
}
Run Code Online (Sandbox Code Playgroud)

这意味着要找到一种方法来为映射器指定所有必需的类,以便执行反序列化.

这可能吗?我查看了文档,但找不到任何解决方案.

我的需要来自于我使用Javassist库来创建这样的类,并且它不支持内部或匿名类.

先感谢您

ska*_*man 6

静态内部类Name和同名的顶级类之间应该没有区别.杰克逊运行时不应该有意义地区分这两种情况.

您是否尝试过移动Name课程User,将其改为顶级课程?它仍然应该像以前一样工作.

编辑:我刚试过这个,当Name是顶级类时,它工作正常.我怀疑,为了简洁,这个例子把它作为一个内部阶级.

  • @Eto:一个upvote和滴答答案是传统的谢谢方法:) (3认同)