我从事这项工作的时间已经太久了,我认为我只是对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-即使知道文件读取后,我的loadTeleports方法也返回null。 GSON
最佳答案
fromJson
方法期望以您的实际JSON数据作为第一个参数的Reader
,JsonReader
,JsonElement
或String
,但是您传递了"teleport-load"
。尝试这样称呼它:
map = gson.fromJson(reader.get("teleport-load"), Teleport[].class);
在这种情况下,
reader.get("teleport-load")
将返回表示JsonElement
属性的teleport-load
,然后fromJson
会将其转换为Teleport[]
数组。