2013-03-16 91 views
1

我有一個類DocumentBO其具有以下屬性 -JSON來對象使用GSON

public class DocumentBO implements IStorageBO { 
    private String aId; 
    private String studyId; 
    private Map<AlgorithmsEnum, JobIOStatus> status; 
    private String text; 
    private Collection<Sentence> sentences; 

    public String getaId() { 
     return aId; 
    } 
    public void setaId(String aId) { 
     this.aId = aId; 
    } 
    public String getStudyId() { 
     return studyId; 
    } 
    public void setStudyId(String studyId) { 
     this.studyId = studyId; 
    } 
    public Map<AlgorithmsEnum, JobIOStatus> getStatus() { 
     return status; 
    } 
    public void setStatus(Map<AlgorithmsEnum, JobIOStatus> status) { 
     this.status = status; 
    } 
    public String getText() { 
     return text; 
    } 
    public void setText(String text) { 
     this.text = text; 
    } 
    public Collection<Sentence> getSentences() { 
     return sentences; 
    } 
    public void setSentences(Collection<Sentence> sentences) { 
     this.sentences = sentences; 
    } 
} 

AlgorithmsEnum是如下 -

public enum AlgorithmsEnum { 
    SENTIMENT("sentiment"), 
    INTENTION("intention"), 
    TOPIC("topic"), 
    NER("ner"), 
    UIMA("uima"); 

    private final String value; 

    private AlgorithmsEnum(String value) { 
     this.value = value; 
    } 

    public String value() { 
     return value; 
    } 

    @Override 
    public String toString() { 
     return value; 
    } 

    public static AlgorithmsEnum fromValue(String value) { 
     if (value != null) { 
     for (AlgorithmsEnum aEnum : AlgorithmsEnum.values()) { 
      if (aEnum.value().equals(value)) { 
       return aEnum; 
      } 
     } 
     } 
     return null; 
    } 
} 

JobIOStatus也類似於。 我能夠成功地創建使用GSON使用以下TypeToken

Type type = new TypeToken<Collection<DocumentBO>>() {}.getType(); 

但是,收藏當我嘗試重新使用和GSON返回的JSON字符串相同TypeToken,關鍵Collection對象的JSON字符串status散列映射始終返回爲NULL而成功創建值。你認爲這可能是什麼問題?

回答

0

當密鑰從對象派生並且它不是「本地」數據類型時,Gson有序列化Map的「已知」問題。 請使用

GsonBuilder builder = new GsonBuilder();  
Gson gson = builder.enableComplexMapKeySerialization().create(); 
Collection<DocumentBO> obj = gson.fromJson(str, type); 
1

的問題是,你已經在你的enum覆蓋toString()

如果你看看正在生產的JSON,你的Map<AlgorithmsEnum, JobIOStatus>的鍵是你創建的小寫字母。這是行不通的。當你試圖反序列化JSON時,Gson不知道如何從那些中重新創建enum

如果您刪除您的toString()方法,它將工作得很好。

另外,您可以序列化,這將忽略你的toString()方法和使用enum值的默認表示這是需要什麼樣的產生JSON當GsonBuilder使用.enableComplexMapKeySerialization()方法。