使用Gson序列化Java对象时添加自定义顶层键及反序列化方法
实现方案
1. 调整序列化逻辑添加顶层玩家ID键
只需在序列化前将PlayerCharacter对象放入以玩家ID为键的Map中,再序列化该Map即可得到你需要的格式,修改后代码如下:
import java.util.HashMap; import java.util.Map; import com.google.gson.GsonBuilder; import java.io.FileWriter; import java.io.Writer; public static void savePlayerGson(String playerId, PlayerCharacter playerCharacter) { try { Writer writer = new FileWriter(KRYMMO.getInstance().getDataFolder() + "/data/playercharacter.json"); // 构造带顶层玩家ID键的包装Map Map<String, PlayerCharacter> wrapMap = new HashMap<>(); wrapMap.put(playerId, playerCharacter); new GsonBuilder().setPrettyPrinting().create().toJson(wrapMap, writer); writer.close(); } catch (Exception ex) { KRYMMO.getInstance().getLogger().severe(ex.getMessage()); } }
2. 带顶层键的JSON反序列化实现
反序列化时先将文件内容解析为Map<String, PlayerCharacter>类型,再通过玩家ID取出对应的PlayerCharacter对象即可:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.io.FileReader; import java.io.Reader; import java.util.Map; public static PlayerCharacter loadPlayerGson(String playerId) { try { Reader reader = new FileReader(KRYMMO.getInstance().getDataFolder() + "/data/playercharacter.json"); // 使用TypeToken解决泛型擦除问题 Type mapType = new TypeToken<Map<String, PlayerCharacter>>(){}.getType(); Map<String, PlayerCharacter> wrapMap = new Gson().fromJson(reader, mapType); reader.close(); return wrapMap.get(playerId); } catch (Exception ex) { KRYMMO.getInstance().getLogger().severe(ex.getMessage()); return null; } }
如果单个JSON文件仅存储一名玩家数据,不需要提前知道玩家ID也可以直接取Map的首个值:
public static PlayerCharacter loadSinglePlayerGson() { try { Reader reader = new FileReader(KRYMMO.getInstance().getDataFolder() + "/data/playercharacter.json"); Type mapType = new TypeToken<Map<String, PlayerCharacter>>(){}.getType(); Map<String, PlayerCharacter> wrapMap = new Gson().fromJson(reader, mapType); reader.close(); return wrapMap.values().iterator().next(); } catch (Exception ex) { KRYMMO.getInstance().getLogger().severe(ex.getMessage()); return null; } }
注:上述代码中用到的
Type和TypeToken均来自com.google.gson.reflect包,需确保项目已正确引入Gson依赖。
内容的提问来源于stack exchange,提问作者Samuel Heinicke
相关产品推荐
相关产品推荐

