Libgdx在Json中加载/保存数组

时间:2016-08-12 17:47:17

标签: arrays json libgdx

我想保存一个Mission.class数组,其变量如下:

public class Mission {

public MissionEnum missionEnum;
public int progress;

public Mission(MissionEnum missionEnum, int progress) {
    this.missionEnum = missionEnum;
    this.progress = progress;
}

并且还在另一个java类中保存任务:

public void saveMissions() {
    Json json = new Json();
    json.setOutputType(JsonWriter.OutputType.json);
    json.addClassTag("Mission", Mission.class);
    FileHandle missionFile = Gdx.files.local("missions_array.json");
    missionFile.writeString(json.prettyPrint(missions), false);
}

并加载任务:

public void loadMissions() {
    if (Gdx.files.local("missions_array.json").exists()) {
        try {
            FileHandle file = Gdx.files.local("missions_array.json");
            Json json = new Json();
            json.addClassTag("Mission", Mission.class);
            missions = json.fromJson(Array.class, Mission.class, file);
            for (Mission mission : missions) {
                Gdx.app.log(TAG, "Mission loaded: " + mission.missionEnum);
            }
            Gdx.app.log(TAG, "Load missions successful");
        } catch (Exception e) {
            Gdx.app.error(TAG, "Unable to read Missions: " + e.getMessage());
        }
    }
}

我这样得到了json:

[
{
"class": "Mission",
"missionEnum": "BUY_POWERUP"
},
{
"class": "Mission",
"missionEnum": "DISTANCE_ONE_RUN_2"
},
{
"class": "Mission",
"missionEnum": "BANANA_TOTAL_2",
"progress": 35
}
]

但是,当loadMissions()运行时,我显示了"Load missions successful"日志,但"Mission loaded..."没有显示任何错误日志。任务似乎没有正确加载。我不知道出了什么问题,因为另一个数组以相同的方式成功加载。

2 个答案:

答案 0 :(得分:1)

更新回复:

添加一个空的构造函数并阅读thisthis

  

您必须向(Mission)添加无参数构造函数,或者   您将不得不添加自定义序列化程序(请参阅   https://code.google.com/p/libgdx/wiki/JsonParsing#Customizing_serialization)   知道如何保存(任务)实例并知道适当的   重新读取(任务)时调用的构造函数。

public Mission() {
    // Do nothing.
}

Reading & writing JSON

  

实现Json.Serializable的类必须具有零参数   构造函数,因为对象构造是为您完成的。

或者删除未使用的构造函数。我认为Enigo的回答也是正确的,所以我要回答他的回答。

Providing Constructors for Your Classes

  

你不必为你的班级提供任何建设者,但是你   这样做时一定要小心。编译器自动提供   no-argument,任何类没有构造函数的默认构造函数。   这个默认构造函数将调用的无参数构造函数   超类。在这种情况下,编译器会抱怨如果   超类没有无参数构造函数,所以你必须验证   它确实如此。如果你的类没有明确的超类,那么它有一个   Object的隐式超类,它有一个无参数   构造

注意:我没有测试我们的回复,我在过去两年没有开发游戏或使用过libgdx。

另请阅读此libgdx问题:Json - constructor default value with Enum

  

我不知道这是否会被称为错误,但我有一个案例   有这样的枚举;

     

然后我有一个包含2个构造函数的类;

     

第二个由我的框架调用,第一个由Json调用   反序列化。

     

...

之前的回复:

我猜想某些Mission类中缺少的进度字段可能是问题的根源,但读取错误日志肯定会很有趣。

我跟着thisthisthis确认了这一点,但如果没有关于确切日志错误的额外信息,那就太难了。

答案 1 :(得分:1)

不确定为什么日志中没有错误,因为在复制问题时我有例外。

问题出在loadMissions()方法:你创建新的Json解析器而不设置类标记:

Json json = new Json();
// add the line below
json.addClassTag("Mission", Mission.class);
missions = json.fromJson(Array.class, Mission.class, file);
....

如果没有标记解析器,则不知道json文件中的"class": "Mission"是什么。

<强>更新

可能导致此问题的另一件事是args构造函数。至少,当我添加它时,我得到了一个例外。如果你不使用它 - 只需删除。 仍然,非常奇怪的是,你肯定没有log'cos中的任何例外。