3

我有一个关于使用 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; }
}

可以通过这种方式使用所谓的“完整数据绑定”对 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 库来创建这样的类,并且它不支持内部类或匿名类。

先感谢您

4

2 回答 2

6

Name静态内部类和同名的顶级类应该没有区别。Jackson 运行时不应该能够有意义地区分这两种情况。

您是否尝试过将Name班级移出User,将其更改为顶级班级?它应该仍然像以前一样工作。

编辑:我刚试过这个,当 Name 是顶级类时它工作正常。我怀疑,为了简洁起见,该示例将其作为内部类。

于 2010-04-05T11:28:19.613 回答
1

先生。斯卡夫曼的回答是正确的。唯一需要提及的是,与 JAXB 不同,Jackson 通常不要求您指定要操作的类,但根类除外(如果您使用多态处理,则并非总是如此)。

于 2010-04-05T19:09:57.727 回答