由找不到字段导致的LibGDX SerializationException

时间:2016-07-05 20:08:06

标签: java json enums libgdx

目前我正在使用LibGDX的JSON输出文件编写类来处理游戏的数据保存(和加载)部分。我一直在谷歌试图找到一个解决方案,并已接近,但没有雪茄。到目前为止,我已经成功地尝试将Array<Object>保存到文件中,但是当我尝试从文件中读取/加载数据时,我得到以下异常:

com.badlogic.gdx.utils.SerializationException: Error reading file: cards.json
    at com.badlogic.gdx.utils.Json.fromJson(Json.java:705)
    at com.towersvault.unbalanced.util.save.SaveHandler.loadCards(SaveHandler.java:91)
    at com.towersvault.unbalanced.util.save.SaveHandler.load(SaveHandler.java:51)
    at com.towersvault.unbalanced.UnbalancedMain.create(UnbalancedMain.java:28)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:147)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124)
Caused by: com.badlogic.gdx.utils.SerializationException: Field not found: cards (com.badlogic.gdx.utils.Array)
Serialization trace:
{}.cards
    at com.badlogic.gdx.utils.Json.readFields(Json.java:790)
    at com.badlogic.gdx.utils.Json.readValue(Json.java:919)
    at com.badlogic.gdx.utils.Json.fromJson(Json.java:703)
    ... 5 more

我的JSON文件如下所示:

{
"cards": [
    {
        "card": "ID_3",
        "temper": "LAZY"
    },
    {
        "card": "ID_2",
        "temper": "LAZY"
    },
    {
        "card": "ID_1",
        "temper": "LAZY"
    },
    {
        "card": "ID_1",
        "temper": "LAZY"
    }
]
}

我的加载方法的源代码如下所示:

Array<CardData> loadedCards = json.fromJson(Array.class, CardData.class, Gdx.files.local("cards.json");

CardData类有两个变量,即private Card card;(输入它,变量是我为每张卡的实例设置的枚举),以及private CardTemper temper;(也是与另一个相同的枚举)。当我进一步实现其余功能时,由于它们不一致,必须有卡的实例。

我不确定自己哪里出错了,我认为这主要是因为我在处理保存和加载游戏信息方面缺乏经验。

如果有人可以帮助我,我们将不胜感激。

谢谢, 克利福

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是创建新的类Cards,如下所示:

public class Cards {
    private Array<CardData> cards;

    public Array<CardData> getCards() {
        return cards;
    }

    public void setCards(Array<CardData> cards) {
        this.cards = cards;
    }
}

然后检索以下值:

Cards cardsJson = json.fromJson(Cards.class, Gdx.files.local("cards.json")); 
Array<CardData> loadedCards = cardsJson.getCards();

另一个是将json文件更改为:

[
    {
      "card": "ID_3",
      "temper": "LAZY"
    },
    {
      "card": "ID_2",
      "temper": "LAZY"
    },
    {
      "card": "ID_1",
      "temper": "LAZY"
    },
    {
      "card": "ID_1",
      "temper": "LAZY"
    }
]

然后检索以下值:

Array<CardData> fromJson = json.fromJson(Array.class, CardData.class, Gdx.files.local("cards.json"));

我更喜欢第一种变体,但选择权在你手中。

答案 1 :(得分:0)

当我尝试从JSON字符串解析为具有基元的对象时遇到了这个问题,就像Integer而不是int一样。

将对象类型更改为int而不是Integer使其再次起作用。

为澄清起见,这仅在我将项目从纯Java更改为Android时发生 (将插件:“ java”应用到gradle上,将插件:“ android”应用到Java项目)(使用Libgdx的json或Gson)有效