我从事这项工作的时间已经太久了,我认为我只是对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数据作为第一个参数的ReaderJsonReaderJsonElementString,但是您传递了"teleport-load"。尝试这样称呼它:

map = gson.fromJson(reader.get("teleport-load"), Teleport[].class);


在这种情况下,reader.get("teleport-load")将返回表示JsonElement属性的teleport-load,然后fromJson会将其转换为Teleport[]数组。

09-28 06:55