You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 17:36:05