2016-01-19 7 views
0

Пусть у меня есть JSON-файл, как это:Сохранить имя объекта в переменную экземпляра во время GSON Десериализация

{ 
    "ObjectName1": { 
    "enabled": true, 
    "SSOIDS": [] 
    }, 
    "ObjectName2": { 
    "enabled": true, 
    "SSOIDS": [] 
    }, 
    "ObjectName3": { 
    "enabled": true, 
    "SSOIDS": [] 
    }, 
    "ObjectName4": { 
    "enabled": true, 
    "IDs": [] 
    } 
} 

Я хочу derserialize данные и сохранить «ObjectNameX» в поле, Objectname, мой Java объект, например:

public class Feature implements Serializable { 

private static final long serialVersionUID = 1L; 

private String objectName; 

private Boolean enabled; 

private List<String> IDs; 

private boolean checkLastTwoChars; //sometimes my json objects might have this 
            //element.However in this example it doesn't 
//Getters and Setters left out for brevity 

Я прочитал немного о создании пользовательского десериализаторе here в d создали ниже класс:

public class FeatureDeserializer implements JsonDeserializer<Feature> { 
    public Feature deserialize(JsonElement json, Type typeOfT, 
     JsonDeserializationContext context) throws JsonParseException { 
    Feature ft = new Feature(); 
    if(!json.isJsonNull()){ 
     ft.setFeatureName(json.getAsJsonObject().getAsString()); 
     //json.getAsJsonObject().getAsString()--> `{"enabled":true,"SSOIDS":[],"checkLastTwoChars":false} 
    } 
    return ft; 
    } 

} 

но параметр JSON в десериализаторе не имеет доступ к objectNameX во время выполнения только то есть ключевые пары значений полого Objet доступны. Я знаю, что GSON десериализует правильные значения и имеет доступ к объектуNameX от отладчика eclipse.

Вот как я называю fromJson():

// just the part I think is relevant 
Map<String, Feature> featureCache = new HashMap<String, Feature>(); 
for(File file : files){ 
      try { 
        BufferedReader br = new BufferedReader(new FileReader(file)); 
        StringBuilder sb = new StringBuilder(); 
        while(br.ready()){ 
         sb.append(br.readLine()); 
        } 
        br.close(); 
        Gson gson = new GsonBuilder().setPrettyPrinting(). 
          registerTypeAdapter(Feature.class, new FeatureDeserializer()).create(); 
        featureCache = gson.fromJson(sb.toString(), new TypeToken<SortedMap<String, Feature>>(){}.getType()); // features in a specific file 

Есть стандартный способ для сохранения каждого objectNamex в каждом уникальном объекте, который я десериализации ??

ответ

0

Вот мое решение проблемы сохранения каждого объектаNamex в каждом уникальном объекте, который я десериализую, но я по-прежнему не уверен, является ли это лучшей или даже обычной практикой.

Я понял, что:

Gson gson = new GsonBuilder().setPrettyPrinting(). 
         registerTypeAdapter(Feature.class, new FeatureDeserializer()).create(); 
       featureCache = gson.fromJson(sb.toString(), new TypeToken<SortedMap<String, Feature>>(){}.getType()); // features in a specific file 

фактически создает карту с objectNamex как ключ к каждому уникальному объекту Feature поэтому

Я создал вспомогательную функцию:

private void fillInFeatureNames(Map<String, Feature> featureCache){ 
     for (String featName: featureCache.keySet()){ 
      featureCache.get(featName).setFeatureName(featName); 
     } 
    } 

, который проходит через каждую клавишу на карте и устанавливает каждый uniq ue в поле featureName объекта с именем объекта. Это действительная работа, но я все еще хотел знать, была ли предпочтительная практика в этих усилиях.

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