1

我有一个具有以下属性的类DocumentBO -

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 成功创建一个 JSON 字符串

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

但是,当我尝试使用 Gson 返回的 JSON 字符串重新创建 Collection 对象时,hashmapTypeToken的键status始终返回为NULL,而值已成功创建。你认为可能是什么问题?

4

2 回答 2

1

问题是你toString()在你的enum.

如果您查看正在生成的 JSON,您的键Map<AlgorithmsEnum, JobIOStatus>是您正在创建的小写名称。那是行不通的。enum当您尝试反序列化 JSON 时,Gson 不知道如何从这些中重新创建。

如果您删除您的toString()方法,它将正常工作。

或者,您可以.enableComplexMapKeySerialization()在序列化时使用该方法,该方法GsonBuilder将忽略您的toString()方法并使用所需的值的默认表示生成 JSON enum

于 2013-03-16T22:54:17.673 回答
0

当键是从对象派生而不是“本机”数据类型时,Gson 序列化 Map 存在“众所周知的”问题。请使用这个

GsonBuilder builder = new GsonBuilder();    
Gson gson = builder.enableComplexMapKeySerialization().create(); 
Collection<DocumentBO> obj = gson.fromJson(str, type);
于 2013-03-16T11:47:46.360 回答