我有很多相关的对象,我使用gson反序列化。目前,每个反序列化器都完全实现了反序列化。
我想弄清楚如何最小化它们之间的代码重复,可能是通过在多个反序列化器之间划分工作。
这些是我已经实施和使用的一些例子:
public static class WeaponDeserializer implements JsonDeserializer<Weapon> {
@Override
public Weapon deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
String name = context.deserialize(json.getAsJsonObject().get("name"), String.class);
ItemQuality quality = json.getAsJsonObject().get("quality") != null ? context.deserialize(json.getAsJsonObject().get("quality"), ItemQuality.class) : ItemQuality.Common;
Availability availability = context.deserialize(json.getAsJsonObject().get("availability"), Availability.class);
String description = context.deserialize(json.getAsJsonObject().get("description"), String.class);
double weight = json.getAsJsonObject().get("weight") != null ? json.getAsJsonObject().get("weight").getAsDouble() : 0.0;
WeaponClass weaponClass = context.deserialize(json.getAsJsonObject().get("class"), WeaponClass.class);
WeaponType weaponType = context.deserialize(json.getAsJsonObject().get("type"), WeaponType.class);
String damage = context.deserialize(json.getAsJsonObject().get("damage"), String.class);
String penetration = json.getAsJsonObject().get("pen").getAsString();
String range = context.deserialize(json.getAsJsonObject().get("range"), String.class);
String rateOfFire = context.deserialize(json.getAsJsonObject().get("rof"), String.class);
int clip = json.getAsJsonObject().get("clip") != null ? context.deserialize(json.getAsJsonObject().get("clip"), Integer.class) : 0;
String reload = context.deserialize(json.getAsJsonObject().get("reload"), String.class);
Set<String> specialRules = context.deserialize(json.getAsJsonObject().get("special qualities"), new TypeToken<Set<String>>() {
}.getType());
Set<UpgradeOrCustomization> upgrades = json.getAsJsonObject().get("upgrades") != null ? context.deserialize(json.getAsJsonObject().get("upgrades"), new TypeToken<Set<UpgradeOrCustomization>>() {
}.getType()) : Collections.EMPTY_SET;
return new Weapon(name, quality, availability, description, weight, weaponClass, weaponType, damage, penetration, range, rateOfFire, clip, reload, specialRules, upgrades);
}
}
public static class WeaponDeserializer implements JsonDeserializer<Weapon> {
@Override
public Weapon deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
String name = context.deserialize(json.getAsJsonObject().get("name"), String.class);
ItemQuality quality = json.getAsJsonObject().get("quality") != null ? context.deserialize(json.getAsJsonObject().get("quality"), ItemQuality.class) : ItemQuality.Common;
Availability availability = context.deserialize(json.getAsJsonObject().get("availability"), Availability.class);
String description = context.deserialize(json.getAsJsonObject().get("description"), String.class);
double weight = json.getAsJsonObject().get("weight") != null ? json.getAsJsonObject().get("weight").getAsDouble() : 0.0;
WeaponClass weaponClass = context.deserialize(json.getAsJsonObject().get("class"), WeaponClass.class);
WeaponType weaponType = context.deserialize(json.getAsJsonObject().get("type"), WeaponType.class);
String damage = context.deserialize(json.getAsJsonObject().get("damage"), String.class);
String penetration = json.getAsJsonObject().get("pen").getAsString();
String range = context.deserialize(json.getAsJsonObject().get("range"), String.class);
String rateOfFire = context.deserialize(json.getAsJsonObject().get("rof"), String.class);
int clip = json.getAsJsonObject().get("clip") != null ? context.deserialize(json.getAsJsonObject().get("clip"), Integer.class) : 0;
String reload = context.deserialize(json.getAsJsonObject().get("reload"), String.class);
Set<String> specialRules = context.deserialize(json.getAsJsonObject().get("special qualities"), new TypeToken<Set<String>>() {
}.getType());
Set<UpgradeOrCustomization> upgrades = new HashSet<>();
for (JsonElement element : json.getAsJsonObject().get("upgrades") != null ? json.getAsJsonObject().get("upgrades").getAsJsonArray() : Collections.<JsonElement>emptySet()){
upgrades.add(UpgradeOrCustomization.getByName(element.getAsString()));
}
return new Weapon(name, quality, availability, description, weight, weaponClass, weaponType, damage, penetration, range, rateOfFire, clip, reload, specialRules, upgrades);
}
}