2013-03-16 3 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 также аналогична , Я успешно удалось создать JSON строку коллекции с помощью GSON с помощью следующей TypeToken

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

Но, когда я пытаюсь воссоздать объект Collection, используя строку JSON, возвращаемой Gson и тот же TypeToken, ключ то hashmap status всегда возвращается как NULL, тогда как значение успешно создается. Как вы думаете, что может быть проблемой?

ответ

0

Есть «хорошо» известные проблемы Gson для сериализации карты, когда ключ получен из объекта и не является «родным» типом данных. Пожалуйста, используйте этот

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

Проблема заключается в том, что вы переопределены toString() в вашем enum.

Если вы посмотрите на произведенный JSON, то ключи к вашему Map<AlgorithmsEnum, JobIOStatus> - это имена нижнего регистра, которые вы создаете. Это не сработает. Gson понятия не имеет, как воссоздать enum от тех, когда вы пытаетесь десериализовать JSON.

Если вы удалите свой метод toString(), он будет работать нормально.

В качестве альтернативы вы можете использовать метод .enableComplexMapKeySerialization() в GsonBuilder при сериализации, который будет игнорировать ваш метод toString() и производить JSON с помощью представлений по умолчанию ваших enum значений которых является то, что требуется.

Смежные вопросы