2016-01-19 20 views
0

假設我有一個JSON文件中像這樣:保存對象名稱到一個實例變量中GSON反序列

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

我想derserialize數據和「ObjectNameX」存儲到一個領域,對象名,我的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。 我知道GSON反序列化了正確的值,並且可以從eclipse調試器訪問objectNameX。

以下是我打電話的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

這裏是我解決保存每個唯一對象中的每個objectNamex問題的解決方案,但是我仍然不確定這是否是最佳甚至常見的做法。

我意識到:

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的地圖作爲密鑰對每個唯一的功能對象因此

我創建一個輔助函數:

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

循環遍歷映射中的每個鍵並設置每個uniq將特徵對象featureName字段添加到鍵名。這是一個有效的解決方法,但我仍然想知道在這項工作中是否有一個首選的做法。

相關問題