我为此工作了太久,我想我只是在用 GSON 做一些愚蠢的事情,不太确定。我的调试表明它进入了 map = builder.fromJson 方法,但它仍然返回 null。
保存和加载方法
public static void saveTeleportData() {
Path path = Paths.get("./data/definitions/teleports.json");
File file = path.toFile();
file.getParentFile().setWritable(true);
if (!file.getParentFile().exists()) {
try {
file.getParentFile().mkdirs();
} catch (SecurityException e) {
System.out.println("Unable to create directory for Teleport data!");
}
}
try (FileWriter writer = new FileWriter(file)) {
Gson builder = new GsonBuilder().setPrettyPrinting().create();
JsonObject object = new JsonObject();
object.add("teleport-load", builder
.toJsonTree(***Teleport Object Array***));
writer.write(builder.toJson(object));
writer.close();
} catch (Exception e) {
System.out.println("Failure");
}
}
保存方法输出此
https://pastebin.com/D5VpJXAj
所以这对我来说是正确的。
这是为加载所有"传送"对象而调用的方法
public static Teleport[] loadTeleports() {
// Create the path and file objects.
Path path = Paths.get("./data/definitions/teleports.json");
File file = path.toFile();
// Now read the properties from the json parser.
Teleport[] map = null;
try (FileReader fileReader = new FileReader(file)) {
JsonParser fileParser = new JsonParser();
Gson builder = new GsonBuilder().create();
JsonObject reader = (JsonObject) fileParser.parse(fileReader);
if (reader.has("teleport-load")) {
map = builder.fromJson("teleport-load", Teleport[].class);
return map;
}
} catch (Exception e) {
return null;
}
return map;
}
这也是我的传送类,我不确定我可能做错了什么,所有的建议都值得赞赏!如果您有任何问题,请告诉我!
public class Teleport {
private final String name;
private final Position position;
private final TeleportGroups teleGroup;
public Teleport(String name, Position position, TeleportGroups teleGroup) {
this.name = name;
this.position = position;
this.teleGroup = teleGroup;
}
public String getName() {
return name;
}
public Position getPosition() {
return position;
}
public TeleportGroups getTeleType() {
return teleGroup;
}
}
TL;DR - 我的加载传送方法返回 null,即使我知道它读取文件。格森
fromJson
方法需要一个Reader
、一个JsonReader
、一个JsonElement
或一个String
,并将你的实际JSON数据作为第一个参数,但你传递"teleport-load"
。试着这样称呼它:
map = gson.fromJson(reader.get("teleport-load"), Teleport[].class);
在这种情况下,reader.get("teleport-load")
将返回一个表示 teleport-load
属性的JsonElement
,然后fromJson
将其转换为 Teleport[]
数组。