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も同様です次の TypeToken を使用して、GSON を使用して Collection の JSON 文字列を正常に作成できます。

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

しかし、Gson と同じ によって返された JSON 文字列を使用して Collection オブジェクトを再作成しようとするとTypeToken、ハッシュマップのキーstatusは常にNULLとして返されますが、値は正常に作成されます。何が問題になると思いますか?

4

2 に答える 2

1

問題はtoString()enum.

生成されている JSON を見ると、キーMap<AlgorithmsEnum, JobIOStatus>は作成している小文字の名前です。それはうまくいきません。enumJSONを逆シリアル化しようとすると、Gsonはそれらから再作成する方法を知りません.

メソッドを削除すると、toString()問題なく動作します。

.enableComplexMapKeySerialization()または、シリアル化するときにメソッドを使用して、メソッドGsonBuilderを無視し、必要な値toString()のデフォルト表現を使用して JSON を生成することもできますenum

于 2013-03-16T22:54:17.673 に答える
0

キーがオブジェクトから派生し、「ネイティブ」データ型ではない場合、Map をシリアル化する Gson の問題は「よく知られた」ものです。これを使用してください

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