Json使用Gson对象

时间:2013-03-16 10:02:01

标签: java json enums gson

我有一个 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 也类似。 我使用以下TypeToken

成功地使用GSON创建了Collection的JSON字符串
Type type = new TypeToken<Collection<DocumentBO>>() {}.getType();

但是,当我尝试使用Gson返回的JSON字符串和相同的TypeToken重新创建Collection对象时,status hashmap的键始终返回为 NULL 而值已成功创建。您认为这个问题是什么?

2 个答案:

答案 0 :(得分:1)

问题是您已在toString()中覆盖了enum

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

如果您删除toString()方法,它就可以正常使用。

或者,您可以在序列化时.enableComplexMapKeySerialization()中使用GsonBuilder方法忽略您的toString()方法,并使用enum值的默认表示生成JSON,这是什么是必须的。

答案 1 :(得分:0)

当密钥是从对象派生而不是“本机”数据类型时,Gson有“井”知道的问题来序列化Map。 请使用此

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