我正在尝试使用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
]
}
]
答案 0 :(得分:0)
可能没有“最好”的方式,因为它可能取决于你的真实情况。但是为了有效地反序列化和序列化这个对象,你必须:
因为它在语法上是非法的: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机制来指定目标类型(各种库使用类似的技术)。由于Java泛型的工作方式(类型参数化只能写入类,字段或方法,但不能直接写入),因此将TypeToken
指定为源的类型将不起作用并且基本上会导致List.class
实例,除非他们自己有足够的类型信息或使用自定义反序列化器,这些反序列化器知道可以从[例如,特殊合成字段]获得此类信息的位置。)
List<Map<String, Object>>
请注意,类型标记是线程安全的(以及private static final TypeToken<List<GameItem>> listOfGamesTypeToken = new TypeToken<List<GameItem>>() {
};
个实例)并且可以在全局范围内轻松共享(但明智地)。
使用Gson
实例反序列化的最佳方法是从Gson
或Reader
读取(两者都完美地使用流)。同样适用于JsonReader
和Writer
。
JsonWriter