我有一个 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 而值已成功创建。您认为这个问题是什么?
答案 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);