使用Gson

时间:2017-02-03 22:52:07

标签: java json gson

我正在尝试使用JSON文件为游戏创建缓存。编写和检索此数据将使用GSON完成。我有一个包含多个对象的JSON文件,在这些对象中也存储了其他对象。

我的问题是:如何以最佳方式检索此数据?

对象1:

public class GameItem {

    private final int id;
    private final String name;
    private final String description;
    private final int shopValue;
    private final ItemStats stats;

    public GameItem(int id, String name, String description, int shopValue, ItemStats stats) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.shopValue = shopValue;
        this.stats = stats;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public int getShopValue() {
        return shopValue;
    }

    public ItemStats getStats() {
        return stats;
    }

}

对象2:

public class ItemStats {

    private final int stabAttack;
    private final int slashAttack;
    private final int crushAttack;
    private final int magicAttack;
    private final int rangeAttack;
    private final int stabDefence;
    private final int slashDefence;
    private final int crushDefence;
    private final int magicDefence;
    private final int rangeDefence;
    private final int strengthBonus;
    private final int prayerBonus;

    public ItemStats(int stabAttack, int slashAttack, int crushAttack, int magicAttack, int rangeAttack, int stabDefence, int slashDefence, int crushDefence, int magicDefence, int rangeDefence, int strengthBonus, int prayerBonus) {
        this.stabAttack = stabAttack;
        this.slashAttack = slashAttack;
        this.crushAttack = crushAttack;
        this.magicAttack = magicAttack;
        this.rangeAttack = rangeAttack;
        this.stabDefence = stabDefence;
        this.slashDefence = slashDefence;
        this.crushDefence = crushDefence;
        this.magicDefence = magicDefence;
        this.rangeDefence = rangeDefence;
        this.strengthBonus = strengthBonus;
        this.prayerBonus = prayerBonus;
    }

    public int getStabAttack() {
        return stabAttack;
    }

    public int getSlashAttack() {
        return slashAttack;
    }

    public int getCrushAttack() {
        return crushAttack;
    }

    public int getMagicAttack() {
        return magicAttack;
    }

    public int getRangeAttack() {
        return rangeAttack;
    }

    public int getStabDefence() {
        return stabDefence;
    }

    public int getSlashDefence() {
        return slashDefence;
    }

    public int getCrushDefence() {
        return crushDefence;
    }

    public int getMagicDefence() {
        return magicDefence;
    }

    public int getRangeDefence() {
        return rangeDefence;
    }

    public int getStrengthBonus() {
        return strengthBonus;
    }

    public int getPrayerBonus() {
        return prayerBonus;
    }
}

JSON数据:

[
    {
        "id": 0,
        "name": "Dwarf_remains",
        "description": "The_body_of_a_Dwarf_savaged_by_Goblins.",
        "shopValue": 1,
        "stats": [
            "stabAttack": 0,
            "slashAttack": 0,
            "crushAttack": 0,
            "magicAttack": 0,
            "rangeAttack": 0,
            "stabDefence": 0,
            "slashDefence": 0,
            "crushDefence": 0,
            "magicDefence": 0,
            "rangeDefence": 0,
            "strengthBonus": 0,
            "prayerBonus": 0
        ]
    },
    {
        "id": 1,
        "name": "Toolkit",
        "description": "Good_for_repairing_a_broken_cannon.",
        "shopValue": 1,
        "stats": [
            "stabAttack": 0,
            "slashAttack": 0,
            "crushAttack": 0,
            "magicAttack": 0,
            "rangeAttack": 0,
            "stabDefence": 0,
            "slashDefence": 0,
            "crushDefence": 0,
            "magicDefence": 0,
            "rangeDefence": 0,
            "strengthBonus": 0,
            "prayerBonus": 0
        ]
    },
    {
        "id": 2,
        "name": "Cannonball",
        "description": "Ammo_for_the_Dwarf_Cannon.",
        "shopValue": 3000,
        "stats": [
            "stabAttack": 0,
            "slashAttack": 0,
            "crushAttack": 0,
            "magicAttack": 0,
            "rangeAttack": 0,
            "stabDefence": 0,
            "slashDefence": 0,
            "crushDefence": 0,
            "magicDefence": 0,
            "rangeDefence": 0,
            "strengthBonus": 0,
            "prayerBonus": 0
        ]
    }
]

1 个答案:

答案 0 :(得分:0)

可能没有“最好”的方式,因为它可能取决于你的真实情况。但是为了有效地反序列化和序列化这个对象,你必须:

  • 首先,修复您的JSON文件

因为它在语法上是非法的:stats属性应声明为{}括起来的对象(不是[和{{1}的数组}):

]
  • 使用正确的"stats": { "stabAttack": 0, "slashAttack": 0, "crushAttack": 0, "magicAttack": 0, "rangeAttack": 0, "stabDefence": 0, "slashDefence": 0, "crushDefence": 0, "magicDefence": 0, "rangeDefence": 0, "strengthBonus": 0, "prayerBonus": 0 }
  • 告诉Gson数组元素的真实类型

这是一种特殊的Gson机制来指定目标类型(各种库使用类似的技术)。由于Java泛型的工作方式(类型参数化只能写入类,字段或方法,但不能直接写入),因此将TypeToken指定为源的类型将不起作用并且基本上会导致List.class实例,除非他们自己有足够的类型信息或使用自定义反序列化器,这些反序列化器知道可以从[例如,特殊合成字段]获得此类信息的位置。)

List<Map<String, Object>>

请注意,类型标记是线程安全的(以及private static final TypeToken<List<GameItem>> listOfGamesTypeToken = new TypeToken<List<GameItem>>() { }; 个实例)并且可以在全局范围内轻松共享(但明智地)。

  • 对I / O流应用缓冲读取和写入

使用Gson实例反序列化的最佳方法是从GsonReader读取(两者都完美地使用流)。同样适用于JsonReaderWriter

JsonWriter