2010-04-05 83 views
3

我有一個關於使用Jackson的Json反序列化的問題。 我想用一類像這樣的反序列化JSON文件: (從http://wiki.fasterxml.com/JacksonInFiveMinutes拍攝)Json Jackson沒有內部類的反序列化

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庫來創建這樣的類,並且它不支持內部或匿名類。

預先感謝您

回答

6

應該有靜態內部類Name和頂層類同名沒有任何區別。傑克遜運行時不應該能夠有意義地區分這兩種情況。

您是否試過將Name中的類從User中移出,將其更改爲頂級類?它應該仍然像以前一樣工作。

編輯:我剛試過這個,當Name是一個頂級類的時候它工作正常。我懷疑這個例子是爲了簡潔而將它作爲一個內部類。

+0

非常感謝你skaffman! 我沒有意識到這一點。 – 2010-04-05 12:32:50

+3

@Eto:贊同並答覆答案是傳統的感謝方法:) – skaffman 2010-04-05 12:36:44

1

先生。 Skaffman的答案是正確的。唯一值得一提的是,與JAXB不同的是,除了根類(並不總是如此,如果使用Polymorphic Handling),Jackson通常不會要求您指定您操作的類。

+0

JAXB不會 - 您只需指定根元素,再加上那些只能由多態關聯訪問的元素。 – skaffman 2010-04-05 19:25:57

相關問題