Java JSON 加载返回空值



我为此工作了太久,我想我只是在用 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[] 数组。

最新更新