gpt4 book ai didi

java - GSON 将所有字段设置为空

转载 作者:行者123 更新时间:2023-12-02 12:05:21 26 4
gpt4 key购买 nike

我今天第一次使用 GSON。现在我正在尝试用值反序列化和序列化一个类。反序列化工作完美,但加载后只会将所有字段输出为空。我真的很想知道我做错了什么,或者为什么它不起作用。

待填类(class):

public class PlayerData {

private static Map<UUID, PlayerData> playerDataMap = new HashMap<UUID, PlayerData>();
public UUID uuid;
public Integer kills;
public Integer level;
public Integer xp;
public SkillType skillType;

public PlayerData() {
playerDataMap.put(getUUID(), this);
String logString = "[DEBUG] " + uuid + " " + skillType + " " + level;
ZombieSurvival.getInstance().getLogger().info(logString);
}
}

保存代码:

private synchronized void savePlayerData(){
try {
Map<UUID, PlayerData> map = PlayerData.getPlayerDataMap();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String seperator = File.separator;
String path = getDataFolder().getAbsolutePath() + seperator + "PlayerData" + seperator;
File folder = new File(path);
folder.mkdirs();
for(UUID uuid : map.keySet()){
PlayerData pd = map.get(uuid);
String json = gson.toJson(pd);
File myFile = new File(folder,uuid.toString() + ".json");
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter =new OutputStreamWriter(fOut);
myOutWriter.append(json);
myOutWriter.close();
fOut.close();
}
} catch (Exception e){
e.printStackTrace();
}
}

信息:JSON 内容是通过此方法创建的!

加载代码:

private void loadPlayerData() {
try {
//Setup GSON Loading
String seperator = File.separator;
File invasionMobFolder = new File(getDataFolder() + seperator + "PlayerData" + seperator);
invasionMobFolder.mkdirs();
File[] listOfFiles = invasionMobFolder.listFiles();
for (File file : listOfFiles) {
if (file.getName().endsWith(".json")) {
FileInputStream fIn = new FileInputStream(file);
BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn));
String aDataRow = "";
String aBuffer = ""; //Holds the text
while ((aDataRow = myReader.readLine()) != null) {
aBuffer += aDataRow;
}
myReader.close();
Gson gson = new Gson();
gson.fromJson(aBuffer, PlayerData.class);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

JSON 内容:

{
"uuid": "ba79c71f-aa2c-4f8b-a7e5-d6bfea7a4dcc",
"kills": 0,
"level": 0,
"xp": 0,
"skillType": "KNIGHT"
}

最佳答案

正如 Steve Bishop 所说或试图说的那样,不使用 loadPlayerData 中的 gson.fromJson 方法调用的返回值。如果要将 PlayerData 对象保存到静态变量中,则不能在每个 PlayerData 类的构造函数中执行此操作,因为 GSON 很可能会先调用构造函数,然后使用 json 字符串中的匹配字段填充变量通过反射导致您的空填充字段。

您要做的就是从 gson.fromJson 获取反序列化的 JSON,并将其放入静态 PlayerData.playerDataMap 字段中,该字段显然至少需要一个公共(public) setter .

关于java - GSON 将所有字段设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46938489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com