避免gson反序列化器之间的代码重复

时间:2015-03-18 06:04:02

标签: java json gson json-deserialization

我有很多相关的对象,我使用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);
    }
}

0 个答案:

没有答案